I’m familiar with Promises, but have inherited some rather unusual code that, rather than making a new Promise()
, uses the following:
Promise.resolve().then(
function() {
// Do useful things
}
)
From my research, this is a weird version of setImmediate – ie, run the following function on the next tick.
What would be the await
version of this?
Advertisement
Answer
There may be two different reasons for the Promise.resolve()
. You touched on one of them:
Defer until the end of the current run of the JS event loop
Here the obvious answer is await Promise.resolve();
.
await undefined
does the same thing implicitly, but why not be explicit?
Singular error handling
Promise.resolve()
is also often seen at the head of a promise chain for singular error handling:
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
Promise.resolve()
.then(() => doSomething(""())) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function
Without it, the first step may throw an exception instead, which may be unexpected!
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
doSomething(""()) // bug!
.then(() => doSomething("else"))
.catch(e => console.log("Got " + e)); // uncaught!
Here the answer is: you no longer need the Promise.resolve()
prologue with async/await.
async
functions implicitly catch synchronous exceptions and return a rejected promise instead, guaranteeing singular error handling and a promise return value:
const doSomething = x => new Promise(r => setTimeout(() => r(x), 1000));
(async () => {
await doSomething(""()); // bug!
await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function
Not only is this a nice invariant and less to type, unlike the Promise.resolve()
kludge, it actually still calls doSomething
synchronously:
function doSomething() {
console.log("doSomething() called");
""() // bug!
return new Promise(r => setTimeout(() => r(x), 1000));
}
(async () => {
await doSomething();
await doSomething("else");
})().catch(e => console.log("Got " + e)); // Got TypeError: "" is not a function
console.log("here");
This would be pretty hard to pull off any other way. Another reason async/await is great!