如何动态添加函数到队列?

时间:2015-06-05 15:20:20

标签: javascript angularjs queue promise

我有render(value)功能,我用不同的参数多次调用。我需要对这个函数进行链接调用,以便它只在前一个调用完成时才开始执行。

我需要链接的函数返回一个promise:

function render(value){
   var deferred = $q.defer();

   /* Some logic here */

   return deferred.promise;
}

我应该在这里放置什么?

function onClick(value){
   /*
       Add render(value) to the queue. And start execution if queue is empty
   */
}

2 个答案:

答案 0 :(得分:1)

那只是then链接 -

创建队列:

var queue = $q.when(); 

添加要在队列上运行的函数:

queue = queue.then(function(){ // need to reassign since promises are immutable.
    console.log("Added!");
});

所以,在你的例子中:

function onClick(value){
  queue = queue.then(function(){ return render(value); });
}

答案 1 :(得分:0)

您可能想尝试以下方面的内容:

var lastPromise;

function onClick(value) {
    var promise;

    if( lastPromise ) {
        promise = lastPromise.then(function() {
            return render(value);
        }).then(cleanup);
    }
    else {
        promise = render(value).then(cleanup);
    }

    lastPromise = promise;

    function cleanup() {
        if( promise === lastPromise ) {
            lastPromise = null;
        }
    }
}

lastPromise保留最后的链接承诺;这可以确保每个render()在前一个完成之后运行。内部promise是“私人”承诺的概念。如果,当我们得到解决时,私人承诺与最后承诺相同,那么我们将其清理干净。警告:未经测试!