gpt4 book ai didi

javascript - 使用 Bluebird Promise 创建节流功能

转载 作者:行者123 更新时间:2023-11-28 07:32:19 28 4
gpt4 key购买 nike

我正在尝试创建一个节流功能。我看过一些 SO 帖子并复制了一些代码,但我无法让它延迟。

基本上,我的类中有许多需要调用 Amazon API 的方法。它们都使用一个通用函数 - doCall,我实现如下:

Amazon.prototype.doCall = function(func) {
var self = this;

var queue = P.resolve();

function throttle(fn) {
var res = queue.then(function() { // wait for queue
return fn(); // call the function
});

queue = P.delay(61000).return(queue); // make the queue wait for 61 seconds
return res; // return the result
}


// Create instance of MWS client
if (!this.client) {
this.client = new mws.Client(key, secret, merchant, {});
}

var call = function() {

// The library uses a weird signature so I am wrapping it thus
return new P(function(resolve, reject) {

// The original MWS library call
self.client.invoke(func, function(r, e) {
// ... stuff
resolve(r);
});
});

};
return throttle(call);
};

基本上,我获取订单列表和订单,并且需要将每个调用延迟 60 秒以上。现在这一切都在毫不拖延地发生。有建议吗?

我基本上是这样使用它的(做作但应该给出想法)

self.doCall(ListOrders).then(function(res) { 
// parse results
self.doCall(ListMoreOrdersByPage).then(function(res) {
// Now I might go through each and fetch details
var ids = [...] // Parse result for ids
return P.map(ids, function(id) {
return doCall(GetOrderById);
});
....

最佳答案

你的问题是

Amazon.prototype.doCall = function(func) {
var queue = P.resolve();

意味着您在每次调用该方法时都会重新创建一个新的队列。不太有帮助。相反,您可能希望每个 Amazon 有一个队列,因此请将初始化放在构造函数中。

我还稍微简化了您的代码:

function Amazon(…) {

this.queue = P.resolve();
}

Amazon.prototype.doCall = function(func) {
if (!this.client) {
// Create instance of MWS client
this.client = new mws.Client(key, secret, merchant, {});
}

var self = this;
var res = this.queue.then(function() {
// The library uses a weird signature so I am wrapping it thus
return new P(function(resolve, reject) {
self.client.invoke(func, function(r, e) {
// ... stuff
resolve(r);
});
});
});

this.queue = this.queue.delay(610000); // make the queue wait for 61s
// if you want to make it wait *between* calls, use
// this.queue = res.catch(function(){}).delay(610000);
return res;
};

关于javascript - 使用 Bluebird Promise 创建节流功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000478/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com