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

How to dynamically add functions to the queue?

我有 render(value) 函数,我用不同的参数调用了多次。我需要链接调用此函数,以便它仅在上一个调用完成后才开始执行。

我需要链接 returns 承诺的函数:

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
   */
}

您可能想尝试以下方法:

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 是 "private" 承诺的概念。如果,当我们解决时,私有承诺与最后一个承诺相同,那么我们就清理它。警告:未经测试!

那只是 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); });
}