为什么javascript承诺没有';在for循环中不异步?

为什么javascript承诺没有';在for循环中不异步?,javascript,asynchronous,es6-promise,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, re

我有这样的代码:

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
的执行器函数同步运行,然后返回承诺,然后
loop2
的执行器函数同步运行;稍后,将异步调用实现处理程序

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

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

const loop1=length=>新承诺((解析)=>{
setTimeout(解析、长度、长度)
})
const loop2=长度=>新承诺((解析)=>{
setTimeout(解析、长度、长度)
})
const startTime=new Date().getTime()
循环1(800)。然后(结果=>{
const endTime=new Date().getTime()
常量持续时间=结束时间-开始时间
log(`loop1:${duration}`,result)
}).catch(错误=>console.log('loop1错误:',错误))
循环2(1)。然后(结果=>{
const endTime=new Date().getTime()
常量持续时间=结束时间-开始时间
log(`loop2:${duration}`,result)
}).catch(错误=>console.log('loop2错误:',错误))
const endTime=new Date().getTime()
常量持续时间=结束时间-开始时间
console.log('duration',duration)