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

标签 javascript asynchronous promise long-running-processes

<分区>

在我的项目中,我有一个运行时间很长的操作,所以我决定将它放在 Promise 中,因为我认为这样我可以继续执行其他操作,而内部代码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");

但是我还是想不通为什么Promise里面的代码是同步执行的? 它不应该异步执行吗?

最佳答案

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 的东西。在浏览器或新的 worker_threads Node.js 中的 API。

关于javascript - 为什么 Promise 中的代码会同步执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51386537/

相关文章:

javascript - 删除显示 :none with JQuery 时出现问题

objective-c - Objective C 后台的异步方法

angular - 链接 HTTP promise 时如何调用 catch 方法?

Javascript:promise中的.then()没有执行?

javascript - react typescript 打字不起作用

asp.net - 如何以编程方式单击 asp.net 中的 EIT Lightbox 超链接

javascript - 在哪里将我的 mongodb Atlas 连接到我的 React 应用程序?

javascript - 如何处理异步循环函数中的await调用-nodejs

javascript - 在函数内部修改变量后,为什么变量未更改? -异步代码引用

javascript - 在自定义服务中通过 Promise Angular 获取值(value)