Angular q.all即时与延迟响应

时间:2017-07-28 15:00:34

标签: javascript angularjs real-time angular-promise q

我有一个方法论问题。目前我使用$q.all在一次回复中捕获多个承诺,然后将所有结果作为单个请求处理。

ie:$q.all([promise1(),promise2(),promise3(),promise(4),promise5()])..then(function(response){ ...}

但是,我注意到有时会在明显不同的时间段内返回不同的承诺。所有承诺都是对第三方网站的http呼叫。当任何特定的承诺延迟8秒......或14秒时,所有承诺的最终结果都会延迟相同的持续时间。最弱的......相当“最慢”......链接综合症。

我可以使用另一种方法同时调用所有承诺,但仍允许用户处理结果并进行查看?在不立即处理它们之前,不等待它们全部退回?

2 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,你可以单独使用它们,但如果你真的想要同时调用它们并在一个承诺中处理它们,你可以使用notify - 承诺的回调。我创建了$q的扩展程序,它使用此notify()函数将promise作为一个解析:

app.run(function($q){
    $q.each = function(promises){
        var deferred = $q.defer();

        promises.forEach(function(promise){
            promise.then(function(data){
                deferred.notify(data);
            });
        });
        return deferred.promise;
    };
});

这是一个非常天真的实现,例如不处理错误,但它让您了解所涉及的内容。

然后你就像这样使用它:

var promises = [promise1(),promise2(),promise3(),promise(4),promise5()];

$q.each(promises).then(null, null, function(data){
    console.log(data);  // This is called when each promise resolves.
});

Here's a Plunker showing this in action

答案 1 :(得分:0)

请记住,then()$q.all()等方法无法确定承诺的执行方式;它们只是建立了你想要回应的语义。我的意思是,承诺在您创建它们时开始运行,即使流畅的myPromise.then(doSomething)读数似乎暗示其他意义。

$q.all与“承诺”结合起来的事实加以结合,因为它根据原始承诺的解决或拒绝状态创建了一个解决或拒绝的新承诺;并且承诺不仅限于一个处理程序......

promise1.then(function () {
    //stuff that only cares about promise1 and needn't wait for the others
});
$q.all(promise1, promise2, ...).then(function () {
    //stuff that can't be done until everything finishes
});