Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does awaiting a non-Promise have any detectable effect?

One can await a non-Promise and that's good so.

All these expressions are valid and cause no error:

await 5 await 'A' await {} await null await undefined  

Is there any detectable effect of awaiting a non-Promise? Is there any difference in behavior one should be aware of to avoid a potential error? Any performance differences?

Are the following two lines completely same or do they theoretically differ?:

var x = 5 var x = await 5 

How? Any example to demonstrate the difference?

PS: According TypeScript authors, there is a difference:

var x = await 5; is not the same as var x = 5;; var x = await 5; will assign x 5 in the next tern, where as var x = 5; will evaluate immediately.

like image 358
ttulka Avatar asked Mar 20 '19 14:03

ttulka


People also ask

What happens if you await a non promise?

This rule applies when the await operator is used on a non-Promise value. await operator pauses the execution of the current async function until the operand Promise is resolved. When the Promise is resolved, the execution is resumed and the resolved value is used as the result of the await .

Can you await in a non-async function?

You can not use the await keyword in a regular, non-async function. JavaScript engine will throw a syntax error if you try doing so.

Does await only work with promises?

From the tutorial: As said, await only works inside async function. And await just waits for the promise to settle within the async function.

Can you await a non-async function Python?

So it is a pretty firm rule that you cannot use await in a non-async function. Whenever asyncio decides it has enough resources it sends that message.


2 Answers

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 Promises 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).

like image 64
Jonas Wilms Avatar answered Sep 21 '22 22:09

Jonas Wilms


Completely agreed with Jonas's statements. One thing that was not answered in his question was Are the following two lines completely same or do they theoretically differ?:

following two lines are not completely same, they're theoretically different.

  1. var x = 5
  2. var x = await 5

execution time in my console for 1st and 2nd statement is 0.008056640625ms and 0.055908203125ms respectively. async/await, setTimeOut etc are APIs provided by Run time in which JavaScript Run time is running. Putting await on a non-promise will be executed in event-loop. Line 1 will be executed right after reaching the stack but the line 2 will take few time(milliseconds) as it will 1st go to the stack and then to the task queue after skipping webAPI waiting section because there's no promise to be resolved & finally after that control will be given to stack again for execution.

like image 20
fahad tufail Avatar answered Sep 20 '22 22:09

fahad tufail