0

我有一个每分钟只能进行 60 个 API 调用的对象。所以我想做的是,当一个我知道我不会被允许放置的函数调用到来时,将它添加到队列中,然后在更方便的时间再次调用该函数。

这是我想解决的方法

var API_caller = function(){
    this.function_queue = [];
};

API_caller.prototype.make_api_call = function(){
    if(this.can_make_call()){
        this.make_call();
    } else {
        // If I cant place an API call then add 
        // the function to the function queue
        this.function_queue.push(this.make_api_call);       
    }
};

API_caller.prototype.queue_call = function(){
    // remove function from queue and call it
    var func = this.function_queue.shift();
    func();
}

这适用于没有参数的函数,但如果make_api_call()有参数怎么办

API_caller.prototype.make_api_call = function(data){
    if(this.can_make_call()){
        this.make_call();
    } else {
        // If I cant place an API call then add 
        // the function to the function queue
        this.function_queue.push(this.make_api_call(data));     
    }
};

但是,在这种情况下,make_api_call(data)将在将其推送到之前对其进行评估,function_queue并且func将不再持有导致queue_call()错误的函数。

我怎样才能解决这个问题?

4

3 回答 3

1

您可以使用以下方法将参数部分应用于函数bind

this.function_queue.push(this.make_api_call.bind(this, data));

检查MDN以获取旧浏览器的支持。

于 2013-06-16T05:40:46.860 回答
0

队列条目应包含函数,f以及作为数组的参数p

当您添加到队列中时,您会执行类似的操作queue.push ([f, arguments]),而当您需要拨打电话时,您会执行类似的操作queue[0][0].apply (null, queue[0][1])

于 2013-06-16T05:45:43.100 回答
0

您可以将包含您的 API 调用且参数已绑定的 ad-hoc 函数排队:

var that = this;
this.function_queue.push(function() {
    that.make_api_call(data);
));

thisto的别名that是必需的,因为在匿名函数内部,this不会绑定到与外部相同的对象。

请注意,此技术类似于 eclanrs 的答案,但不依赖于bind方法的可用性。

于 2013-06-16T05:46:27.270 回答