为什么Promise中的代码同步执行?

时间:2018-07-17 16:44:28

标签: javascript asynchronous promise long-running-processes

在我的项目中,我的运行时间很长,因此决定将其放在Promise中,因为我认为通过这种方式,我可以继续执行其他操作,而{{1 }}正在运行。

在调试时,我发现Promise外部的代码仅在Promise内部的代码完成执行时执行。

这是我在项目中正在做的事的一个示例(它模拟一个较长的操作,因此需要一段时间):

Promise

我不太确定为什么会这样,这就是我问的原因。但是我认为new Promise(function(resolve, reject) { var i = 0; while (i < 1000000000) { i++ } console.log("Executing inside Promise"); }); console.log("Executing outside Promise");中的代码是同步的,这在某种程度上与事实有关。 确实,当它异步(即Promise方法)时,它将在外部代码完成执行后运行。

setTimeout()

但是我仍然不知道为什么new Promise(function(resolve, reject) { setTimeout(function() { var i = 0; while (i < 1000000000) { i++ } console.log("Executing inside Promise"); }, 3000) }); console.log("Executing outside Promise");中的代码是同步执行的? 它不应该异步执行吗?

1 个答案:

答案 0 :(得分:1)

Promise构造函数中的代码旨在同步运行。这样做的原因是它允许您执行以下操作:

var resolve, reject
var p = new Promise(function (res, rej) { resolve = res; reject = rej })
// you can return this `p` from a function or use it with p.then()
// then later
resolve(value)

请注意,即使您在for内运行,像setTimeout循环这样长时间运行的代码也会被 阻塞。如果您在超时时间内运行它,它将在其他时间阻止其他所有内容。 Promises的异步部分对于诸如网络请求之类的I / O很有用,它需要等待结果。 for循环不需要等待,实际上,这非常辛苦:)。如果需要并行运行昂贵的代码,则必须在浏览器中使用Web Workers之类的东西,或者在Node.js中使用新的worker_threads API。