为什么Java Promise没有在for循环中进行异步操作?

2022-04-03 00:00:00 asynchronous javascript 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 Executor函数)同步调用。这样它就可以启动承诺所代表的异步流程(无论它是什么)。

因此,在您的代码中,loop1的Executor函数同步运行,然后返回Promise,然后loop2的Executor函数同步运行;稍后,实现处理程序被异步调用。

记住:承诺不会把同步的事情变成异步的事情。它们只是提供了观察已经异步操作的结果的标准化方法。

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

数据-lang="js"数据-隐藏="真"数据-控制台="真"数据-巴贝尔="假">
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)

相关文章