Consider the following code.
(async () => {
const values = {}
const orders = []
let promise = 0
promise = new Promise(async resolve => {
values[1] = promise
orders.push(1)
resolve(1)
values[2] = promise
orders.push(2)
await new Promise(async r => {
values[3] = await promise
orders.push(3)
setTimeout(r, 100)
})
values[4] = await promise
orders.push(4)
promise = 2
values[5] = promise
orders.push(5)
})
values[6] = await promise
orders.push(6)
await new Promise(resolve => setTimeout(resolve, 100)) // (*). try removing this line, result will change
values[7] = await promise
orders.push(7)
console.log(values, orders)
})()
Console output:
{ '1': 0, '2': 0, '3': 0, '4': 1, '5': 2, '6': 1, '7': 1 }
[ 1, 2, 3, 6, 4, 5, 7 ]
My questions are:
Is there any statement in the above snippet which is undefined behavior? If no, I am confused of the ES6 promise after checking the result.
Why is
values[7]
1
, not2
? Update: with node v10.19.0, it is 1. With nodev14.0.0, node-v12.10.0 and browser, it is 2.
Update 2: repeating the evaluation with node v10.19.0, after 20 times of values[7] be 1, once it will be 2.
If I remove the (*) line, the result changes to below. Why are 4, 5 removed?
{ '1': 0, '2': 0, '3': 0, '6': 1, '7': 1 } [ 1, 2, 3, 6, 7 ]
If you have any rule of thumb for this kind of execution, please share. The more I write JS promise code, the more I get confused.
Check for more tests here.