AngularJS:解决自我链接的承诺

时间:2014-07-11 22:16:10

标签: javascript angularjs promise angular-promise

我知道承诺可以链接,如本例所示:

// we also have deferA, deferB and deferC as the corresponding defer objects
promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

promiseC = promiseB.then(function(result) {
    // do stuff to resolve C
});

现在,如果我致电deferA.resolve(data)这将解析promiseA,则会运行then方法,然后解析promiseB。最后,promiseB' then将运行并解析promiseC。平坦而简单(希望我做对了)。

然而,如果承诺与自己联系会发生什么?

如果我将上述示例更改为:

// we also have deferA and deferB as the corresponding defer objects
promiseA = promiseA.then(function(result) {
    // do stuff to...?
});

promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

deferA.resolve(data);

现在会发生什么?执行的顺序是什么?

更多,结果如何:

// we also have deferA and deferB as the corresponding defer objects
promiseA = promiseA.then(function(result) {
    // do stuff to...?
});

deferA.resolve(data);

promiseB = promiseA.then(function(result) {
    // do stuff to resolve B
});

在这种情况下会发生什么?

1 个答案:

答案 0 :(得分:5)

这不是关于promises,而是关于JavaScript中的引用。

当你这样做时:

p = p.then(function(){...

您正在更改p所指的承诺,您没有更改延迟对象在您填写/拒绝时将解决的承诺 - 在您重新分配之前仍然是p它。所以在你的示例代码中:

promiseA = promiseA.then(function(result) { // THIS WILL EXECUTE FIRST
    // do stuff to...?
});

promiseB = promiseA.then(function(result) { // THIS WILL EXECUTE SECOND
    // do stuff to resolve B
});

deferA.resolve(data);

将多个.then处理程序附加到承诺时,如下所示:

var p = first.then(...

var p2 = first.then(...

我在这里假设一个Promises / A +实现。规范保证.then处理程序将在first完成时执行。它总是按照添加的顺序发生。

所以,在上面的例子中:

  • 第一个promiseA将解决
  • 然后上面的promiseA.then将会运行(首先添加的那个)
  • 然后底部的promiseA.then将运行(稍后添加的那个)

.then添加之前或之后解决延迟不会以明显的方式改变结果(琐事:jQuery承诺不是这种情况,这对他们来说是个大问题)。


虽然可能会创建一个循环的承诺链,但有点困难。就像它可以创建一个无限循环。好的promise库将运行它,或抛出循环引用错误。