我有一个对象,每分钟只能发出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()
错误的函数。
我该如何解决这个问题?
答案 0 :(得分:1)
您可以使用bind
部分将参数应用于函数:
this.function_queue.push(this.make_api_call.bind(this, data));
检查MDN以获取旧浏览器的支持。
答案 1 :(得分:0)
队列条目应包含函数f
和参数作为数组p
。
当您添加到队列时,您会执行类似queue.push ([f, arguments])
的操作,当有时间进行调用时,它将类似于queue[0][0].apply (null, queue[0][1])
答案 2 :(得分:0)
您可以使用已绑定的参数排队包含API调用的ad-hoc函数:
var that = this;
this.function_queue.push(function() {
that.make_api_call(data);
));
需要this
到that
的别名,因为在匿名函数中,this
不会绑定到与外部相同的对象。
请注意,此技术类似于eclanrs的回答,但不依赖于bind
方法的可用性。