首页 > 解决方案 > 为什么 Javascript 的语言设计不包括在使用变量之前等待变量解析?

问题描述

await在 Javascript 中,您需要明确告诉您的代码在使用关键字之前等待变量解析,如下所示:

let x = await doSomethingAsynchronous()
console.log(`The result is ${x.result}`)

x.result如果没有特别包含“await”,Javascript 会很乐意在解决之前尝试访问x,因此会抛出错误。为什么这是默认值?程序员希望在解析变量之前多久使用一次?为什么 Javascript 编译器不await直接在使用未解析的变量之前插入?

我对 Javascript 很陌生,如果答案很明显,我很抱歉,并提前感谢您的帮助。

脚注 -

  1. “使用”是指以某种方式访问​​(例如x.result),而不仅仅是传递给另一个函数,在这种情况下,当然不需要立即解析。
  2. 我可以看到,await如果程序员想要显式调用它,例如,当要解析的变量尚未使用时,在语言语法中使用关键字是有用的,但下一行取决于doSomethingAsynchronous具有的一些副作用已完成。所以我不是在问为什么它存在于语言语法中,只是为什么默认情况下不插入它。

标签: javascriptasynchronousasync-await

解决方案


程序员希望在解析变量之前多久使用一次?

实际上很少。我只记得我注释掉等待的一个案例,它是这样的:

 const result = await database();

 if(check)
   /*await*/ notifyUser();

 return result;

在这种情况下我需要它,因为我不介意通知是否在响应返回后到达。我仍然把评论留在那里,以确保未来的读者得到异步。所以是的,如果有相反的关键字,我(和其他人)会节省很多打字。

[那么]为什么这是[不等待]默认值?

我只能看到两个原因:

如果等待是隐式的,您无法从代码中判断它的行为方式,函数调用可能会导致函数执行停止并且您会得到意外的执行顺序(难以调试 = 错误):

async function stuff() {
 a();
 console.log("a");
 b();
 console.log("b");
}

stuff(); stuff(); // a, a, b, b ... what the ... ?

使用await是明确的,您知道async function可能会在哪里停止。

此外,引擎必须检查每个函数调用和每个方法调用的响应是否返回一个承诺:

 promise() // await this?
  .then(/*...*/); // or this?
 maybe(); // or this?

由于 JavaScript 是一种非常动态的语言,通常返回数字的函数可能会突然返回 Promise,因此引擎必须检查每个调用是否有 Promise,这会带来很多开销,并且很难优化。由于await引擎不需要检查,它只会在你告诉它等待的地方等待,这样可以进行更好的优化。

但是我不是 ES Comitee 的一员,要得到明确的答案问他们,我只能推测他们的原因。


推荐阅读