【问题标题】:Why javascript promise doesn't async in for loop? [duplicate]为什么javascript promise不会在for循环中异步? [复制]
【发布时间】:2020-04-18 12:51:11
【问题描述】:

我有这样的代码:

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 呢? 为什么持续时间不是

【问题讨论】:

    标签: javascript asynchronous es6-promise


    【解决方案1】:

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

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

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

    如果您更新您的代码以模拟异步操作(在这种情况下,我将使用 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)

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多