2017-07-28 92 views
1

我有一个方法问题。目前,我正在使用$q.all在单一回报中捕获多个承诺,然后将所有结果作为单个请求处理。角度q.all即时与延迟响应

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

不过,我注意到,有时不同的承诺,在显著不同时间段返回。所有的承诺都是对第三方网站的http调用。当任何特定承诺延迟了8秒...或14秒时,所有承诺的最终结果都会延迟相同的持续时间。最弱的......比较“最慢的”......连接综合征。

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

+0

不要将它们分组在“全部”中。而是分开使用它们。 –

回答

0

正如评论中所建议的那样,您可以单独使用它们,但是如果您真的想在同一时间全部打电话给他们并且在一个承诺中处理他们,您可以使用承诺的回调函数notify。我创建了一个扩展$q使用此功能notify()解决的承诺作为一个:

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

谢谢尼古拉克 - 这是我所寻找的更多。它现在给了我一些想法,我将在周末开展类似的工作。会回复问题和/或结果。谢谢。 – rolinger

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 
});