等待无承诺会产生任何可察觉的影响吗?

时间:2019-03-20 14:19:47

标签: javascript ecmascript-2017

一个人可以await非承诺,that's good so

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

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

等待无承诺有可检测的效果吗?为了避免潜在的错误,应该注意哪些行为上的差异?有任何性能差异吗?

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

var x = 5
var x = await 5

如何?有什么例子可以证明区别吗?

PS:根据TypeScript authors,有一个区别:

  

var x = await 5;var x = 5;不同; var x = await 5;将在下一个tern中分配x 5,其中var x = 5;将立即求值。

2 个答案:

答案 0 :(得分:5)

await不是禁忌。如果等待的东西不是承诺,则将其包装在承诺中,等待该承诺。因此,await更改了执行顺序(但是您仍然不应依赖它):

console.log(1);
(async function() {
  var x = await 5; // remove await to see 1,3,2
  console.log(3);
})();
console.log(2);

此外,await不仅适用于instanceof Promise,而且适用于使用.then方法的每个对象:

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

等待不承诺有任何可检测的影响吗?

当然,如果.then在等待的事物上存在,就会被调用。

  

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

如果您不希望将其命名为Promise,请不要将其命名为“ then”。

  

任何性能差异?

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

答案 1 :(得分:1)

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

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

  1. var x = 5
  2. var x =等待5
在我的控制台中,第一条和第二条语句的执行时间分别为 0.008056640625ms 0.055908203125ms 异步/等待,setTimeOut等是由运行时提供的API,其中JavaScript运行时正在运行。event-loop中执行等待的承诺。第1行将在到达stack之后立即执行,但第2行将花费一些时间(毫秒),因为它会首先跳过stack,然后跳过webAPI等待到达task queue部分,因为没有希望解决的问题,最后,该控制权将再次交给stack以便执行。