AngularJs链接承诺并使用通知

时间:2014-11-05 14:16:49

标签: angularjs promise angular-promise

当我有多个承诺并逐一解决时,我可以轻松地在每个承诺得到解决时收到通知。

然而,当我链接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()时是否可以收到通知?

1 个答案:

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