用javascript编写一个函数队列

writing a function queue in javascript

本文关键字:一个 函数 队列 javascript      更新时间:2023-09-26

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

我怎样才能绕过这个?

您可以使用bind将部分参数应用于函数:

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

检查旧浏览器是否支持MDN

队列条目应该包含函数f和参数数组p

当你添加到队列时,你可以使用类似queue.push ([f, arguments])的格式当需要进行调用时,可以使用类似queue[0][0].apply (null, queue[0][1])的格式

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

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

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

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