等待非 Promise 有任何可检测的效果吗?

问题描述 投票:0回答:3

一个人可以

await
一个非承诺和那很好.

所有这些表达式都是有效的并且不会导致错误:

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

等待非承诺是否有任何可检测的效果?为了避免潜在的错误,人们应该注意的行为有什么不同吗?有什么性能差异吗?

以下两行是完全相同还是理论上不同?:

var x = 5
var x = await 5

如何?任何例子来证明差异?

PS:根据 TypeScript 作者,有区别:

var x = await 5;
var x = 5;
不同;
var x = await 5;
将在下一个学期分配 x 5,其中
var x = 5;
将立即评估。

javascript ecmascript-2017
3个回答
103
投票

await
不是空操作。如果等待的东西不是一个承诺,它就被包裹在一个承诺中,并且那个承诺是等待的。因此
await
改变了执行顺序(但你不应该依赖它):

以下输出1、2、3:

console.log(1);

(async function() {
  var x = await 5;
  console.log(3);
})();

console.log(2);

删除

await
后,它是1、3、2:

    console.log(1);

    (async function() {
      console.log(3);
    })();

    console.log(2);

此外,

await
不仅适用于
instanceof Promise
s,而且适用于具有
.then
方法的每个对象:

await { then(cb) { /* nowhere */ } };
console.log("will never happen");

等待非 Promise 是否有任何可检测的效果?

当然,如果它存在于等待的事物上,

.then
就会被调用。

为了避免潜在的错误,人们应该注意哪些行为差异?

如果你不希望它成为 Promise,请不要将方法命名为“then”。

任何性能差异?

当然,如果你等待事情,你总是将继续推迟到微任务。但一如既往:你可能不会注意到它(作为观察结果的人)。


28
投票

完全同意乔纳斯的说法。他的问题中没有回答的一件事是以下两行是完全相同的还是理论上不同?:

以下两行不完全相同,理论上是不同的。

  1. 变量 x = 5
  2. var x = 等待 5

第一条和第二条语句在我的控制台中的执行时间分别为 0.008056640625ms0.055908203125msasync/await、setTimeOut 等是运行 JavaScript Run time 的 Run time 提供的 API。 将 await 放在 non-promise 上将在

event-loop
中执行。第 1 行将在到达
stack
后立即执行,但第 2 行将花费很少的时间(毫秒),因为它将首先转到
stack
然后在跳过 webAPI 等待部分后转到
task queue
因为没有承诺得到解决,最后将控制权再次交给
stack
执行。


0
投票

如果等待的东西没有

then
属性,则等待的代码将包含在承诺中。因此,虽然在性能上存在差异(需要更长的时间),但在 behavior 中没有 observable 差异,除非您等待的东西具有
then
属性——在这种情况下,如果等待的东西是实际上不是一个会完成的承诺。

© www.soinside.com 2019 - 2024. All rights reserved.