【发布时间】:2021-04-15 21:36:35
【问题描述】:
作为探索then 链的一部分,我遇到了两件我无法解释的事情。
这是代码:
let x1 = new Promise((resolve) => {
setTimeout(() => {
console.log('10 seconds first timeout');
resolve(1);
}, 10000)
});
let x2 = x1.then((p1) => {
setTimeout(() => {
console.log('10 seconds second timeout');
console.log(p1);
return ('2');
}, 10000);
});
let x3 = x2.then((p2) => {
setTimeout(() => {
console.log('10 seconds third timeout');
console.log(p2);
return ('3');
}, 10000);
});
console.log(x1, x2, x3);
问题是:
-
x2.then回调在x1.then回调打印之后立即打印。但是x2.then会收到一个超时时间为 10 秒的回调,那么为什么不在打印前等待 10 秒呢?在第一个和第二个之间有 10 秒,正如预期的那样。 -
x1.then回调返回一个字符串'2',据我了解,这个值应该是返回的Promise的值(由Promise包装),那么为什么尝试打印到控制台console.log(p2)它打印 undefined 而不是字符串'2'?
【问题讨论】:
-
您提供给
x1.then和x2.then的函数并不是在10 秒内解决的承诺,它们只是设置了一个计时器以在10 秒内打印一些内容并立即完成。此外,给.then()的回调不会显式返回任何内容。return语句是给setTimeout的回调的一部分。
标签: javascript asynchronous timeout