Chaining async functions?
async-await, ecmascript-2017, javascript, node.js, promise
Solution
You will need to use
async function first() {
console.log('1a', val);
await second();
// ^^^^^
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
// ^^^^^
console.log('2b', val);
}
to chain the `b` logs after the asynchronous execution of the called functions.
And it's the same for
console.log('0a', val);
first();
console.log('0b', val);
only that you cannot use `await` here since you are not inside an `aync function`. Making a function `async` doesn't mean that it magically blocks on everything asynchronous inside it, on the contrary - its result becomes a promise that is always asynchronous, and you can use the `await` keyword. So to make `0b` wait, you can use either
console.log('0a', val);
first().then(function() {
console.log('0b', val);
}, function(err) {
console.error(err);
});
or
(async function() {
try {
console.log('0a', val);
first();
console.log('0b', val);
} catch(err) {
console.log(err);
}
}());
Problem
``` let val = 0; async function first() { console.log('1a', val); second(); console.log('1b', val); } async function second() { console.log('2a', val); third(); console.log('2b', val); } async function third() { console.log('3a', val); val = await new Promise(function (resolve, reject) { setTimeout(function () { resolve(3); }, 1000); }); console.log('3b', val); } console.log('0a', val); first(); console.log('0b', val); ``` I am expecting: ``` 0a 0 1a 0 2a 0 3a 0 3b 3 2b 3 1b 3 0b 3 ``` But I am receiving: ``` 0a 0 1a 0 2a 0 3a 0 2b 0 1b 0 0b 0 3b 3 ``` I'm guessing there is a fundamental thing about async which I am unaware of?