javascript - 为什么 javascript promise 不在 for 循环中异步?

标签 javascript asynchronous es6-promise

<分区>

我有这样的代码:

const loop1 = length => new Promise((resolve, reject) => {
  try {
    let b = 0
    for (let i = 0; i < length; i++) b = b + i
    resolve(b)
  } catch (e) {
    reject(e)
  }
})

const loop2 = length => new Promise((resolve, reject) => {
  try {
    let b = 0
    for (let i = 0; i < length; i++) b = b + i
    resolve(b)
  } catch (e) {
    reject(e)
  }
})

const startTime = new Date().getTime()

loop1(10000000000).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop1: ${duration}`, result)
}).catch(error => console.log('loop1 error:', error))

loop2(1).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop2: ${duration}`, result)
}).catch(error => console.log('loop2 error:', error))

const endTime = new Date().getTime()
const duration = endTime - startTime
console.log('duration', duration)

为什么结果是这样的?:

root@ububtu:~$ node .
duration 15539
loop1: 15545 49999999990067860000
loop2: 15545 0

为什么结果不是这样的?:

root@ububtu:~$ node .
duration 0
loop2: 5 0
loop1: 15545 49999999990067860000

为什么要等待loop1给出结果? 为什么不通过 loop1 先给出结果 loop2? 为什么持续时间不是 < 1 秒而是超过 15 秒?

最佳答案

您传递给Promise 构造函数(promise 执行器 函数)的函数被同步 调用。这样它就可以启动 promise 所代表的异步过程(无论它是什么)。

所以在你的代码中,loop1的executor函数同步运行,然后返回promise,然后同步运行loop2的executor函数;稍后,异步调用履行处理程序。

请记住:Promises 不会将同步事物变成异步事物。它们只是提供一种标准化的方法来观察那些已经异步的事物的结果。

如果您更新代码以模拟异步操作(在本例中我将使用 setTimeout),您会看到 loop2 的处理程序在 之前被调用loop1 的,因为它更早地实现了:

const loop1 = length => new Promise((resolve) => {
  setTimeout(resolve, length, length)
})

const loop2 = length => new Promise((resolve) => {
  setTimeout(resolve, length, length)
})

const startTime = new Date().getTime()

loop1(800).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop1: ${duration}`, result)
}).catch(error => console.log('loop1 error:', error))

loop2(1).then(result => {
  const endTime = new Date().getTime()
  const duration = endTime - startTime
  console.log(`loop2: ${duration}`, result)
}).catch(error => console.log('loop2 error:', error))

const endTime = new Date().getTime()
const duration = endTime - startTime
console.log('duration', duration)

关于javascript - 为什么 javascript promise 不在 for 循环中异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59519581/

相关文章:

javascript - 无法从完整日历事件对象转换为正确格式的日期和时间

javascript - 无限重复字符串 - 返回无限字符串 N 长度内特定字符的计数 - JavaScript

javascript - Typescript不使用JS函数(Typeof)

java - 我们是否应该始终对移动后端使用异步 JAX-RS 资源?

java - Vert.x IO 阻塞操作性能

javascript - JS setInterval 被多次调用

javascript - 在 Shiny 的应用程序中包含一个 javascript 文件

javascript - 如果用户中止连接到服务器(连接时刷新、关闭浏览器等),如何停止执行所有功能(多个异步等)

javascript - 无法让 Redux 在生成器函数中运行

javascript - 如何在 Protractor/ Jasmine 测试中等待 promise ?