Promise.resolve("resolved").then(function(result) {
console.log(result)
});
console.log("promise created");
结果:
"promise created"
"resolved"
我的问题是:为什么执行仍然是异步的? Promise幕后发生了什么?
如果我将console.log
包裹在setTimeout
中并延迟0
,那么承诺解决就会发生在console.log
之前
答案 0 :(得分:1)
对pattern = re.compile('title\s*=\s*{(.*?)},\s*\n\s*year', re.DOTALL|re.I)
的初始调用是同步的,但是您在Promise.resolve(...)
块中链接的任何内容都将总是由于event loop而异步在引擎盖下实施。
您的.then()
在您的承诺链之外被调用,因此在最初的Promise.resolve(...)调用之后立即执行。
由于您的承诺链之外的console.log("promise created");
,一旦初始调用console.log("promise created");
,就会执行控制台日志。
答案 1 :(得分:0)
Ian的回答侧重于技术实施 - 非常感谢。我想发布关于JavaScript并发模型的关于“为什么”的额外答案(我在Pluralsight上观看现代异步JavaScript 时意识到这一点。
让我们想象一段代码:
let progressStatus;
function opThatReturnsPromise() {
return Promise.resolve();
}
opThatReturnsPromise().then(function() {
console.log(progressStatus = "Done");
})
console.log(progressStatus = "In progress...");
如果同步解析“静态”Promise,则此部分将导致输出:
Done
In progress...
这是因为Run-to-completion。因此,确保异步性,确保一致的行为 - 无论在Promise对象封装的操作中实际发生了什么。