使用静态值创建已解决的Promise - 为什么执行仍然是异步的

时间:2016-08-19 16:21:28

标签: javascript asynchronous es6-promise

Promise.resolve("resolved").then(function(result) { 
  console.log(result)
});
console.log("promise created");

结果:

"promise created"
"resolved"

我的问题是:为什么执行仍然是异步的? Promise幕后发生了什么?

如果我将console.log包裹在setTimeout中并延迟0,那么承诺解决就会发生在console.log之前

2 个答案:

答案 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对象封装的操作中实际发生了什么。