【问题标题】:How to dynamically add functions to the queue?如何将函数动态添加到队列中?
【发布时间】:2015-06-05 15:20:19
【问题描述】:

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

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

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

【问题讨论】:

  • @BenjaminGruenbaum 我需要动态地将函数添加到队列中。这样它的执行只有在队列中所有先前的承诺都已解决时才开始。

标签: javascript angularjs queue promise


【解决方案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); });
}

【讨论】:

  • 谢谢!正是我想要的!
  • 干杯,一个承诺基本上一个队列:)
【解决方案2】:

您可能想尝试以下方式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多