我有这样的功能

function queuingFunction(name){

        var deferred = $q.defer()

        $timeout(function(){
            console.log("my name is ",name);
            deferred.resolve(true);
        },3000)

        return deferred.promise;
    }


我正在这样调用函数

communicatorBaseService.queuingFunction(“ Jack”);
communicatorBaseService.queuingFunction(“ max”);
communicatorBaseService.queuingFunction(“ Ray”);

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

我需要的是,在控制台中杰克显示的第3秒,再次显示最大3秒,然后在显示3秒射线之后再次显示。

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

我当时想做的是


接收执行功能的请求
将参数添加到队列
用队列调用queuingFunction
使用队列[0]运行queuingFunction
在queuingFunction完成后,删除队列[0]
检查位置queue [0]是否剩余任何内容,然后使用当前队列重新运行该函数。


可以肯定的是,这不是最好的方法,这可能是个好方法。我正在使用Angular,因此$ q在代码中。我不想使用jQuery。

最佳答案

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

承诺已经是一种队列,因此,如果您可以以一个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/

10-04 17:20