在我的项目中,我的运行时间很长,因此决定将其放在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");
中的代码是同步执行的?
它不应该异步执行吗?
答案 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。