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, not- 2? 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.
 
     
    