在javascript中编写一个函数队列

时间:2013-06-16 05:37:03

标签: javascript function

我有一个对象,每分钟只能发出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()错误的函数。

我该如何解决这个问题?

3 个答案:

答案 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);
));

需要thisthat的别名,因为在匿名函数中,this不会绑定到与外部相同的对象。

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