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

ttu*_*lka 6 javascript ecmascript-2017

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

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

await 5
await 'A'
await {}
await null
await undefined 
Run Code Online (Sandbox Code Playgroud)

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

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

var x = 5
var x = await 5
Run Code Online (Sandbox Code Playgroud)

怎么样?有什么例子可以证明区别吗?

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

var x = await 5;与...不同var x = 5;; var x = await 5;将在下一个tern中分配x 5,其中as var x = 5;将立即评估。

fah*_*ail 13

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

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

  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 等待部分后,因为没有承诺要解决,最后在该控制之后给予stack再次执行。

  • 伟大的。假设它有其他解释:) (3认同)
  • 实际上,问题的最后一部分丢失了,即**以下两行完全相同还是理论上不同?**。 (2认同)
  • 这是一个重要的区别,因为这种行为是为我们“修复”由初级工程师实现的错误,该工程师没有意识到他们“等待”的功能不是承诺,因此不应该做任何事情。“但是它修复了这个错误!” (通过将非承诺函数放入事件循环中“解决”了竞争条件错误......*在*其他事件之后)他们说。我们几乎不知道我们没有人知道“await”的这种行为...... (2认同)

Jon*_*lms 10

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

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

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

await { then(cb) { /* nowhere */ } };
console.log("will never happen");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

是否有任何性能差异?

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

  • @aBetterOliver 示例:您启动两个非常短的运行操作并想要处理它们的结果。您知道操作 1 比操作 2 更早完成,因此您将 1 的结果存储在变量中,并在 2 完成时访问该结果。现在有人有时改变了算法,使得 1 比 2 慢。你的代码崩溃了,没有人知道为什么。如果您必须按特定顺序执行异步任务,则应该明确地写下来。 (5认同)
  • _“但是你不应该依赖它”_为什么不呢? (4认同)