我有这样的代码:
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秒?
答案 0 :(得分:2)
您传递给Promise
构造函数的函数(承诺执行器函数)称为同步。这样便可以启动promise表示的异步过程(无论它是什么)。
因此,在您的代码中,loop1
的执行程序函数是同步运行的,然后返回诺言,然后loop2
的执行程序函数是同步运行的;稍后,实现处理程序将被异步调用。
请记住:承诺不会将同步事物变成异步事物。它们只是提供了一种标准化的方法,可以观察已经已经异步的事物的结果。
如果您更新代码以建模异步操作(在这种情况下,我将使用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)