我们说我有这样的功能
const fn = () => {
return work()
.then((finalResult) => { // then 1
finish(finalResult);
});
};
const work = () => {
return Promise.resolve(1)
.then(() => { // then 2
return process1();
}).then((result) => { // then 3
return process2(result);
});
};
我的问题是:我可以依赖finish
process1
和process2
后调用的事实。具体而言,then 1
附加的承诺是Promise.resolve(1)
,还是附加到then 3
返回的承诺。
答案 0 :(得分:1)
这首先是语法问题。你在做什么等同于
const fn = () => {
const promiseA = work();
const promiseB = promiseA.then(finish); // then 1
return promiseB;
};
const work = () => {
const promiseC = Promise.resolve(1);
const promiseD = promiseC.then(process1); // then 2
const promiseE = promiseD.then(process2); // then 3
return promiseE;
};
只是介绍一些额外的变量(我也简化了函数表达式)。
现在我们可以清楚地看到work()
的结果是它返回的结果,所以promiseA === promiseE
。所以是的,finish
被链接到" then3"的结果。调用
知道then
创建了新的承诺(针对回调的最终结果)而不是返回原始承诺,我们也可以得出结论promiseE !== promiseC
,因此finish
是 链接到Promise.resolve(1)
。
答案 1 :(得分:0)
每个then
将等待其先前的承诺,然后依次运行。
如果前面的promise返回一个值,传递给回调的参数将是该值,或者如果它返回另一个promise,则回调的参数将是该promise的返回值。
承诺加上规范的如果/当履行承诺时,所有相应的onFulfilled回调必须按其原始呼叫的顺序执行。
保证finish(finalResult)
将以process2(result)
的结果运行(当然,除非出现错误。)
我发现this article对于掌握承诺的胆量非常有启发性。