我有以下代码:
function getData(foos, bars) {
var generated = {};
return $q(function(resolve, reject) {
var promises = _.map(foos, function(foo) {
return _.map(bars, function(bar) {
return someServiceCall(foo, bar).then(function(data) {
_.set(generated[foo.id], player.id.toString() + '.data', data);
});
});
});
// Join all promises in to a final resolve
$q.all(promises).then(function() {
resolve(generated);
}, reject);
});
}
我想要实现的是让所有someServiceCall
- s和它的成功处理程序在调用resolve(generated)
时完成。当我在开发人员工具栏中调试这部分代码时,在为每个promise调用resolve(generated)
的成功处理程序之前调用someServiceCall
。
注意:这并不总是会破坏功能,因为对象作为引用传递,所以即使已经调用了resolve也会设置数据,但我认为如果所有这些调用都在时间结束时功能会更清晰决定被称为。
答案 0 :(得分:3)
我刚刚意识到我的愚蠢错误。两个嵌套的地图产生了以下结构:
var promises = [[Promise, Promise][Promise, Promise, Promise]];
虽然$q.all
期望一系列承诺:
var promises = [Promise, Promise, Promise, Promise, Promise];
我可以通过map
替换第一个flatMap
来电来轻松解决此问题:
return _.flatMap(bars, function(bar) {
我仍然很奇怪$q.all
默默地解决了这个承诺而没有错误或警告数据格式不合适。
我希望我能帮助将来遇到这个问题的人。