我是 JS Promises 的新手,我试图理解为什么我会根据这一行是否有返回而得到不同的结果:return foo(2).then(() => {
function foo(num) {
console.log(num)
return new Promise(resolve => setTimeout(resolve, num * 1000));
}
foo(1).then(() => {
return foo(2).then(() => {
console.log(4)
});
}).then(() => {
foo(3)
})
对比
function foo(num) {
console.log(num)
return new Promise(resolve => setTimeout(resolve, num * 1000));
}
foo(1).then(() => {
foo(2).then(() => {
console.log(4)
});
}).then(() => {
foo(3)
})
4/3 的顺序为什么会改变?
调用
.then(someFn)
会创建一个新的承诺。该承诺将解析为任何someFn
返回值。如果someFn
返回undefined
,如您的第二个示例所示,则新承诺可以undefined
立即解析为 。如果someFn
返回承诺 ,如您的第一个示例所示,则它必须等待内部承诺解析,然后外部承诺才知道它应该用什么值解析。简而言之:如果您返回一个内部承诺,则会强制外部承诺等待它。
行为的差异是由于承诺如何链接和返回值所致。
承诺回报
foo(1) 启动并打印 1。它返回一个在 1 秒后解析的 Promise。1 秒后,第一个 then 被调用。它返回来自 foo(2) 的 Promise。foo(2) 启动并打印 2。它返回一个在 2 秒后解析的 Promise。2 秒后,内部 then 打印 4。
外部 then 等待内部 then 完成,因为内部 promise 已返回。内部 promise 解析后,外部 then 执行。FinallSy,foo(3) 启动并打印 3。
不回报内心的承诺
foo(1) 启动并打印 1。它返回一个在 1 秒后解析的 promise。1 秒后,第一个 then 被调用,foo(2) 启动并打印 2。它返回一个在 2 秒后解析的 promise,但这个 promise 不会返回到外部 then。外部 then 不会等待 foo(2) 完成并立即继续。foo(3) 在第一个 promise 解析后启动并打印 3,而不等待 foo(2) 完成。从 foo(2) 启动 2 秒后,内部 then 打印 4。
通过返回内部承诺,外部然后等待内部承诺解决后再继续。因此 foo(3) 在 foo(1) 和 foo(2) 完成后运行。当不返回内部承诺时,外部不会等待内部承诺解决,因此 foo(3) 在 foo(1) 完成后立即运行,独立于 foo(2)。