排队函数调用请求javascript

时间:2015-10-08 07:38:14

标签: javascript angularjs

我有这样的功能

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( “最大”); communicatorBaseService.queuingFunction( “雷”);

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

我需要的是,在第3秒杰克在控制台中显示,再次显示3秒后,再显示3秒后Ray再次显示。

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

我想要做的是

  1. 收到执行该功能的请求
  2. 将参数添加到队列
  3. 使用队列
  4. 调用queuingFunction
  5. 使用队列[0]
  6. 运行queuingFunction
  7. 完成queuingFunction后删除队列[0]
  8. 检查位置队列中是否有任何内容[0]使用当前队列重新运行该功能。
  9. 很确定这不是最好的方法,这可能是一个很好的方法。我正在使用Angular,因此代码中有$ q。我不想使用jQuery。

2 个答案:

答案 0 :(得分:3)

从您的评论中听起来就像您希望能够进行一些函数调用并让它的操作自动按照之前的顺序排序。如果是这样,您将需要某种队列对象,可以累积正在进行的操作和待处理。

Promise已经是一种队列,所以如果你可以从一个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/

答案 1 :(得分:0)

使用@jfriend00方法,如果有兴趣的话,我使用角度$ 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;
            });
        }