您可以从下面看到,只需将同步代码而不是异步代码放入主体中,主体就会立即执行:
function doSomethingAsynchronous() {
return new Promise((resolve) => {
console.log("a");
resolve("promise result");
});
}
doSomethingAsynchronous();console.log("b");
结果显示 Promise 主体立即执行(在打印 'b' 之前):
a
b
Promise 的结果被保留,被释放到一个 'then' 调用中,例如:
doSomethingAsynchronous().then(function(pr){console.log("c:"+pr);});console.log("b");
结果:
a
b
c:promise result
除了在Promise完成之前的不确定延迟和可以调用“then”(点“c”)之外,同样处理主体中的异步代码。所以 'a' 和 'b' 将在doSomethingAsynchronous()
返回后立即打印,但 'c' 仅在 Promise 完成时出现(调用 'resolve')。
表面上看起来很奇怪,一旦添加了对 'then' 的调用,'b' 打印在 'c' 之前,即使一切都是同步的。肯定会打印“a”,然后是“c”,最后是“b”?'a', 'b' 和 'c' 之所以按这个顺序打印是因为无论 body 中的代码是 async 还是 sync ,'then' 方法总是被 Promise 异步调用。
在我看来,我想象setTimeout(function(){then(pr);},0);
一旦调用“resolve” ,“then”方法就会被Promise 之类的东西调用。即当前执行路径必须在传递给“then”的函数被执行之前完成。
从 Promise 规范中看不出它为什么这样做。我的猜测是它确保了关于何时调用 'then' 的一致行为(总是在当前执行线程完成之后),这大概是允许在连续启动Promises
所有then
调用之前将多个堆叠/链接在一起。