21

Await 是 es7 中一个了不起的功能。

但是,每次我使用 await 我发现我必须定义一个异步函数并调用这个函数。

    async function asy(){
        const [resCityGuess,resCityHot,resCityAll]=await Promise.all([
                        this.http.get('api/v1/cities?type=guess'),
                        this.http.get('api/v1/cities?type=hot'),
                        this.http.get('api/v1/cities?type=group')
        ])
        this.cityGuessName=resCityGuess.data.name;
        this.cityGuessId=resCityGuess.data.id;
        this.cityHot=resCityHot.data;
        this.cityAll=resCityAll.data;
    }
    asy.apply(this);

我想要的是使用没有异步功能的等待,例如

        // the async function definition is deleted
        const [resCityGuess,resCityHot,resCityAll]=await Promise.all([
                        this.http.get('api/v1/cities?type=guess'),
                        this.http.get('api/v1/cities?type=hot'),
                        this.http.get('api/v1/cities?type=group')
        ])
        this.cityGuessName=resCityGuess.data.name;
        this.cityGuessId=resCityGuess.data.id;
        this.cityHot=resCityHot.data;
        this.cityAll=resCityAll.data;
        // without call fn

我认为定义函数 fn 并调用这个 fn 有时会重复,所以我想知道是否可以优化这种情况?</p>

我可以在没有异步的情况下使用等待吗?

太感谢了!

4

4 回答 4

26

,运算符仅在函数await中有意义。async

编辑——详细说明:整体asyncawait交易可以被认为是一个 LISP 宏。该语法的作用是通知语言解释系统正在发生的事情,以便它可以有效地将周围代码的转换合成为基于 Promise 的回调请求序列。

因此,使用语法是编码显式 Promise 内容、调用等的隐式捷径.then()。运行时必须知道一个函数是async因为它知道await函数内部的表达式需要转换为通过 a 返回Promise发电机机制。而且,由于重叠的原因,async函数声明上的装饰告诉语言这实际上是一个返回 Promise 的函数并且它需要处理它。

所以,很复杂。改进和扩展 JavaScript 的过程必须考虑到这样一个事实,即世界上存在着难以想象的大量 JavaScript 代码,因此在几乎所有情况下,没有新功能可以导致自 2002 年以来未触及的页面失败。

编辑await——现在,在 2021 年,对于呼叫在模块外层的工作方式有一些规则。它与它在函数情况下的工作方式并不完全相同async,但它是相似的。

于 2017-05-07T14:21:13.963 回答
5

它是向 ECMAScript 提出的。

Chrome/Chromium(以及任何具有最新的基于 V8 的 JS 引擎的东西)都有一个似乎符合规范的工作实现。

该提案本身处于第 3 阶段。

更多信息:

https://github.com/tc39/proposal-top-level-await

https://v8.dev/features/top-level-await

于 2019-12-17T19:36:57.857 回答
0

顶级 await(没有async的await)还不是 JavaScript 功能。

但是,从3.8 版开始,它可以在Typescript中使用。

为了使用它,需要进行以下配置(在 中tsconfig.json):

"module": "esnext" // or "system"
"target": "es2017" // or higher

更多信息:

https://typescript.tv/new-features/top-level-await-in-typescript-3-8/

于 2021-07-27T16:47:45.937 回答
0

解决方案

并非完全没有,async但请看一下,这可能会有所启发。

您可以有效地创建箭头函数(故意匿名)。

箭头函数是用于编写匿名函数的 ECMAScript2015 语法。它们有很多特性将它们与 JavaScript 中的原始函数关键字区分开来,但在许多情况下,它们可以替代匿名函数。

添加async关键字,用括号括住函数并添加另一个括号集以运行该函数。

在函数内部,使用await关键字。

像这样:

(async () => {
    console.log("Message in 5s");
    await new Promise((resolve) => setTimeout(() => resolve(), 5000));
    console.log("If you like it, show it");
})();
于 2022-02-08T11:57:30.560 回答