排队的函数调用请求javascript

Queueing a function call request javascript

本文关键字:javascript 请求 函数调用 排队      更新时间:2023-09-26

我有一个这样的函数

function queuingFunction(name){
        var deferred = $q.defer()
        $timeout(function(){
            console.log("my name is ",name);
            deferred.resolve(true);
        },3000)
        return deferred.promise;
    }

我像这样调用函数

communicatorBaseService.queuingFunction("杰克");communicatorBaseService.queuingFunction("max");communicatorBaseService.queuingFunction("雷");

在控制台中,所有3个结果将在3秒后显示。

我需要的是,在第三秒杰克显示在控制台,再过3秒max显示然后再过3秒Ray显示。

如果我在执行之间调用queuingFunction,它应该被添加到执行队列中。

我想做的是

  1. 接收执行函数的请求
  2. 将参数添加到队列
  3. 用queue
  4. 调用queuingFunction
  5. 使用queue[0]运行queuingFunction
  6. 在queuingFunction完成时删除队列[0]
  7. 检查队列[0]位置是否有剩余,使用当前队列重新运行函数

很确定这不是最好的方法,有什么好的方法可以做到这一点呢?我使用的是Angular,因此$q在代码中。我不想用jQuery

从您的评论中听起来,您希望能够只是进行一些函数调用,并将其操作与之前的操作自动排序。如果是这样,您将需要某种类型的队列对象来累积正在进行和挂起的操作。

Promises已经是一种队列了,所以如果你可以从一个promise开始,每次调用函数时在之前的操作的末尾添加一个新的promise,它就可以对它们进行排序。这里有一种方法:

// initialize queue with a resolved promise
var queue = $q();
function queuingFunction(name){
    // chain this operation onto whatever operation was previously queued
    queue = queue.then(function() {
        var deferred = $q.defer()
        $timeout(function(){
            console.log("my name is ",name);
            deferred.resolve(true);
        },3000)
        return deferred.promise;
    });
}

然后,你可以调用:

queuingFunction("Jack"); 
queuingFunction("max"); 
queuingFunction("Ray");

并且,这三个操作是顺序的。

下面是使用ES6标准承诺的工作演示:http://jsfiddle.net/jfriend00/adq3L6zt/

使用@jfriend00方法,如果有人感兴趣,我使用angular $q做了以下操作

var queue = $q(function(resolve,reject){resolve()});
        service.queuingFunction = function(name){
          // perform some asynchronous operation, resolve or reject the promise when appropriate.
          queue = queue.then(function() {
                var deferred = $q.defer()
                $timeout(function(){
                    console.log("my name is ",name);
                    deferred.resolve(true);
                },3000)
                return deferred.promise;
            });
        }