程序-1
new Promise(resolve => {
resolve('1');
Promise.resolve().then(() => console.log('2'));
}).then(data => {
console.log(data);
}); // output 2 1
程序-2
new Promise(resolve => {
Promise.resolve().then(() => {
resolve('1');
Promise.resolve().then(() => console.log('2'));
});
}).then(data => {
console.log(data);
}); // output 1 2
我对这两个程序的输出确实感到困惑。谁能告诉我这里的执行线程如何工作?
很难理解的是resolve
的工作方式与return
不同。创建Promises
实际上会创建一个新的异步上下文。 Promise
的第一个功能内的所有内容均同步执行。然后使用同步或异步解析的值调用.then()
方法。
[在第一个示例中,您解析了'1'
,但是随后使用Promise
创建了一个新的Promise.resolve()
,然后立即调用了.then()
。因为新的Promise
在第一个内部,所以所有内容都被同步调用。
new Promise(resolve => {
resolve('1'); // Will be accessed in the .then() after then end of the callback
Promise.resolve().then(() => log('2')); // called before the end of the function
// because the context is not yet created
}).then(data => {
log(data);
}); // output 2 1
第二个例子要难得多。您实际上是在第一个Promise
内创建一个Promise
并立即调用它的resolve
。执行顺序为:
eventListeners
到resolve
创建.then
的种类>resolve
时,在.then
中执行回调嵌套promise
的初始函数中没有任何内容。因此它直接进入then
。 .then()
调用初始的resolve()
。在这里,创建了eventListener
的种类,因此我们跳至初始回调。然后,我们返回并执行其余功能。
new Promise(resolve => {
// Because we call resolve right away, the context of the original promise
// is created
Promise.resolve().then(() => {
resolve('1'); // Calling resolve jumps us to the .then
Promise.resolve().then(() => log('2')); // We execute after.then
});
}).then(data => {
log(data);
}); // output 1 2
如果删除了.resolve()
,它将像第一个一样工作:
new Promise(resolve => {
new Promise(() => {
resolve('1');
Promise.resolve().then(() => log('2'));
});
}).then(data => {
log(data);
}); // output 2 1