await
is not a no-op. If the awaited thing is not a promise, it is wrapped in a promise, that promise is awaited. Therefore await
changes the execution order (but you should not rely on it nevertheless):
console.log(1);
(async function() {
var x = await 5; // remove await to see 1,3,2
console.log(3);
})();
console.log(2);
Additionally await
does not only work on instanceof Promise
s but on every object with a .then
method:
await { then(cb) { /* nowhere */ } };
console.log("will never happen");
Is there any detectable effect of awaiting a non-Promise?
Sure, .then
gets called if it exists on the awaited thing.
Is there any difference in behavior one should be aware of to avoid a potential error?
Don't name a method "then" if you don't want it to be a Promise.
Any performance differences?
Sure, if you await things you will always defer the continuation to a microtask. But as always: You won't probably notice it (as a human observing the outcome).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…