当我有多个承诺并逐一解决时,我可以轻松地在每个承诺得到解决时收到通知。
然而,当我链接promises或使用all()
方法时,似乎有些通知会丢失。我想知道为什么会这样。
这是一个例子。假设我有两个异步函数返回一个promise,做一些工作,并且这样做时他们会调用notify一次或多次:
function returnsSomePromise1() {...; setTimeout(...); return promise;}
function returnsSomePromise2() {...; setTimeout(...); return promise;}
现在我有三个选项来解决这些承诺:
var promise1 = returnsSomePromise1();
var promise2 = returnsSomePromise2();
//Option 1: Resolve separate
promise1.then(...);
promise2.then(...);
//Option 2: Resolve chained
promise1.then(promise2).then(...);
//Option 3: Resolve with all()
$q.all([promise1, promise2]).then(...);
在每个then函数中,我附加一个简单的函数来将通知记录到控制台:
.then(..., ..., function(update) { console.log(update); });
现在我觉得有趣的是,所有三个选项在通知方面都会产生不同的结果。第一个打印每个异步操作的所有通知。第二个选项仅打印第一个承诺的通知,使用all()
方法的最后一个选项根本不打印任何通知。
任何人都可以解释造成这些差异的原因以及使用$q.all()
时是否可以收到通知?
答案 0 :(得分:0)
选项1将并行触发承诺,它们将单独解决。如果你想在两者都解决后做某事,你需要使用这个选项添加额外的逻辑
选项2将一个接一个地发布承诺。如果promise2
取决于来自promise1
的内容,则此功能很有用。
此外,您的代码应该是promise1.then(returnsSomePromise2).then(...);
它需要.then()
中的函数才能获得承诺(promise2
)。它调用的函数将返回promise,它将链接它。
选项3将并行触发它们并在两个(全部)完成时解析一个函数。 $q.all()
可以采用数组或对象。在一个数组的情况下,你在你的例子中。传递给.then()
的函数将传递给一个数组。承诺顺序的数组行传递给$.all()
。
$q.all([promise1, promise2]).then(function(result){
var promise1Result = result[0];
var promise2Result = result[1];
})
如果使用命名键传递一个对象,则会在函数传递回.then()
后返回一个对象。键将与传递给$q.all()
$q.all({myFirstPromise:promise1, secondPromise:promise2}).then(function(result){
var promise1Result = result.myFirstPromise;
var promise2Result = result.secondPromise;
})