javascript - 为什么在 JavaScript 函数体内调用 await 需要异步?

标签 javascript async-await

这个问题在这里已经有了答案:





Why do I have to put async keyword to functions which have await keywords?

(1 个回答)



JS async/await - why does await need async?

(3 个回答)



Why 'await' requires 'async' in function definition

(4 个回答)



Nodejs why is await only restricted to async functions?

(3 个回答)



ES2017 - Async vs. Yield

(4 个回答)


去年关闭。




必须使用 异步 包含函数上的关键字以使用 等待在函数体内。

async function fetchMovies() {
  const response = await fetch('/movies');
  console.log(response);
}

fetchMovies();
等待用于在异步 完成时阻塞取() 称呼。从代码中可以看出,函数取电影() 甚至没有返回任何值。即使这样做了,它也会影响调用者使用返回值的方式,但是为什么它对从函数体调用另一个异步调用很重要呢?
我的问题是为什么这是必需的吗?对此有什么好的解释吗?是否与的实际执行需要有关?等待并在较旧的 JavaScript 版本中支持它?
我知道菲菲使用模式可以使用等待但这是否会改变 之后的代码的语义?菲菲代码块以任何方式?
(async () => {
  const response = await fetch('/movies');
  console.log(response);
})();
我也知道顶级 等待在模块中得到支持。
可能是我错过了一些非常明显的东西。

最佳答案

async 的三个原因关键字存在:

  • 在 2015 之前的 ECMAScript 语言版本中,await不是关键字。标记函数async提供句法“救助”以指示函数体内语言语法的重大变化。
    这是最重要的原因。没有 async关键字,所有用 ECMAScript 5 或更早版本编写的程序如果使用 await 将不再工作。关键字作为变量(实际上 this was done intentionally 在某些情况下作为 async/await 标准化之前的 polyfill),因为这会导致不添加 async 的破坏性更改到规范。正因为如此, async在语法上是必要的,以避免破坏语言 .
  • 它为解析器提供了一个方便的标记,避免了无限前瞻以确定函数是否是异步的。
    这使得解析更加高效,这对 ECMAScript 实现者和开发人员都很有吸引力,尽管仅此原因并不能使 async对语法严格必要。
  • async还对函数执行自己的转换,无论 await 是否关键字出现在正文中。
    考虑以下两个函数:
    function foo() {
      if (Math.random() < 0.5) {
        return 'return';
      } else {
        throw 'throw';
      }
    }
    
    async function bar() {
      if (Math.random() < 0.5) {
        return 'return';
      } else {
        throw 'throw';
      }
    }
    
    async执行 function bar() 的以下转换:
    function bar() {
      return new Promise((resolve, reject) => {
        try {
          resolve((/*async function bar*/() => {
            if (Math.random() < 0.5) {
              return 'return';
            } else {
              throw 'throw';
            }
          })());
        } catch (reason) {
          reject(reason);
        }
      });
    }
    
    熟悉 Promise 的人会认识到,我们可以简化上述内容,因为 Promise 构造函数执行器函数会在同步抛出错误时隐式拒绝:
    function bar() {
      return new Promise((resolve) => {
        if (Math.random() < 0.5) {
          return resolve('return');
        } else {
          throw 'throw';
        }
      });
    }
    
  • 关于javascript - 为什么在 JavaScript 函数体内调用 await 需要异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66113393/

    相关文章:

    C# backgroundworker RunworkerCompleted 与异步等待

    javascript - javascript中表单提交的返回方法

    javascript - 在 Express 中接收 POST 请求时登录

    .net - 当你使用 Task.Run 太多以至于线程池耗尽时会发生什么?

    c# - 对同一个任务多次等待可能会导致阻塞

    c# - 为什么我的 TCS 不等待?

    javascript - 如何正确等待 ES6 Javascript 异步函数的解析值?

    javascript - 我如何将今天的日期与 Angular ng-repeat 中的数据库日期进行比较

    javascript - 嵌套 forEach : Uncaught TypeError: data. forEach 不是函数

    javascript - 如何在 TypeScript 中从匿名对象轻松创建强类型对象?