gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:06:26 27 4
gpt4 key购买 nike

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





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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com