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

IT技术 javascript ecmascript-2017
2021-02-23 23:55:47

一个可以await是非Promise的,这很好

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

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

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

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

var x = 5
var x = await 5

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

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

var x = await 5;不一样var x = 5;var x = await 5;将在下一个 tern 中分配 x 5,其中 asvar x = 5;将立即评估。

2个回答

await不是无操作。如果等待的东西不是Promise,它被包裹在Promise中,等待Promise。因此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 Promises,而且适用于具有.then方法的每个对象

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

等待非Promise是否有任何可检测的影响?

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

为了避免潜在错误,应该注意的行为有什么不同吗?

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

有什么性能差异吗?

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

你是什​​么意思no a no op你是说not a no-op对吗?
2021-04-26 23:55:47
“但你不应该依赖它” 为什么不呢?
2021-05-06 23:55:47
@kunal 是的,我打字的速度比键盘反应快,导致了一些有趣的拼写错误:)
2021-05-15 23:55:47
@aBetterOliver 示例:您开始了两个非常短的运行操作并希望使用它们的结果。您知道操作 1 比操作 2 更早完成,因此您将 1 的结果存储在一个变量中,并在 2 完成时访问该结果。现在有人在某个时候改变了算法,所以 1 比 2 慢。你的代码中断了,没有人知道为什么。如果您必须以特定顺序执行异步任务,您应该明确地写下来。
2021-05-15 23:55:47

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

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

  1. 无功x = 5
  2. var x = 等待 5

我的控制台中第一条和第二条语句的执行时间分别0.008056640625ms0.055908203125msasync/await、setTimeOut 等是运行时提供的 API,其中运行 JavaScript 运行时。 将 await 置于 non-promise 将在event-loop. 第 1 行将在到达后立即执行,stack但第 2 行将花费很少的时间(毫秒),因为它将首先转到stack,然后转到task queue跳过 webAPI 等待部分之后,因为没有Promise要解决,最后在该控制之后给予stack再次执行。

来自@JonasWilms 的示例代码非常清楚地显示了差异......
2021-04-26 23:55:47
实际上,问题的最后一部分丢失了,即以下两行完全相同还是理论上不同?.
2021-05-01 23:55:47
伟大的。假设它有其他解释:)
2021-05-04 23:55:47
我认为这个问题已经用示例代码片段回答了。不管怎样,谢谢你!
2021-05-12 23:55:47