Does awaiting a non-Promise have any detectable effect?

后端 未结 2 783
你的背包
你的背包 2020-12-09 08:20

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          


        
相关标签:
2条回答
  • 2020-12-09 08:27

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

    0 讨论(0)
  • 2020-12-09 08:27

    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.

    0 讨论(0)
提交回复
热议问题