I've created a gist testing some different ways of resolving promises, with results. It may be helpful to see the options that work.
Edit: Gist content as per Jin Lee's comment
// Simple gist to test parallel promise resolution when using async / await function promiseWait(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(true); }, time); }); } async function test() { return [ await promiseWait(1000), await promiseWait(5000), await promiseWait(9000), await promiseWait(3000), ] } async function test2() { return { 'aa': await promiseWait(1000), 'bb': await promiseWait(5000), 'cc': await promiseWait(9000), 'dd': await promiseWait(3000), } } async function test3() { return await { 'aa': promiseWait(1000), 'bb': promiseWait(5000), 'cc': promiseWait(9000), 'dd': promiseWait(3000), } } async function test4() { const p1 = promiseWait(1000); const p2 = promiseWait(5000); const p3 = promiseWait(9000); const p4 = promiseWait(3000); return { 'aa': await p1, 'bb': await p2, 'cc': await p3, 'dd': await p4, }; } async function test5() { return await Promise.all([ await promiseWait(1000), await promiseWait(5000), await promiseWait(9000), await promiseWait(3000), ]); } async function test6() { return await Promise.all([ promiseWait(1000), promiseWait(5000), promiseWait(9000), promiseWait(3000), ]); } async function test7() { const p1 = promiseWait(1000); const p2 = promiseWait(5000); const p3 = promiseWait(9000); return { 'aa': await p1, 'bb': await p2, 'cc': await p3, 'dd': await promiseWait(3000), }; } let start = Date.now(); test().then((res) => { console.log('Test Done, elapsed', (Date.now() - start) / 1000, res); start = Date.now(); test2().then((res) => { console.log('Test2 Done, elapsed', (Date.now() - start) / 1000, res); start = Date.now(); test3().then((res) => { console.log('Test3 Done, elapsed', (Date.now() - start) / 1000, res); start = Date.now(); test4().then((res) => { console.log('Test4 Done, elapsed', (Date.now() - start) / 1000, res); start = Date.now(); test5().then((res) => { console.log('Test5 Done, elapsed', (Date.now() - start) / 1000, res); start = Date.now(); test6().then((res) => { console.log('Test6 Done, elapsed', (Date.now() - start) / 1000, res); }); start = Date.now(); test7().then((res) => { console.log('Test7 Done, elapsed', (Date.now() - start) / 1000, res); }); }); }); }); }); }); /* Test Done, elapsed 18.006 [ true, true, true, true ] Test2 Done, elapsed 18.009 { aa: true, bb: true, cc: true, dd: true } Test3 Done, elapsed 0 { aa: Promise { <pending> }, bb: Promise { <pending> }, cc: Promise { <pending> }, dd: Promise { <pending> } } Test4 Done, elapsed 9 { aa: true, bb: true, cc: true, dd: true } Test5 Done, elapsed 18.008 [ true, true, true, true ] Test6 Done, elapsed 9.003 [ true, true, true, true ] Test7 Done, elapsed 12.007 { aa: true, bb: true, cc: true, dd: true } */
awaitwould wait for the first function to complete entirely before executing the second.Promises. The linked question is regarding the bluebird library with generators & yield. Conceptually similar perhaps, but not in implementation.