我知道承诺可以链接,如本例所示:
// 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
});
在这种情况下会发生什么?
答案 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
完成时执行。它总是按照添加的顺序发生。
所以,在上面的例子中:
在.then
添加之前或之后解决延迟不会以明显的方式改变结果(琐事:jQuery承诺不是这种情况,这对他们来说是个大问题)。
虽然可能会创建一个循环的承诺链,但有点困难。就像它可以创建一个无限循环。好的promise库将运行它,或抛出循环引用错误。