是否可以在Js中使用await而不使用异步

时间:2017-05-07 14:09:59

标签: javascript html asynchronous ecmascript-2017

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有时会重复,所以我想知道是否可以优化这种情况?

我可以使用await而不使用异步吗?

非常感谢你!

3 个答案:

答案 0 :(得分:9)

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

编辑 - 详细说明:整个asyncawait交易可以被视为像LISP宏一样。该语法的作用是告知语言解释系统正在发生的事情,以便实际将周围代码的转换合成为基于Promise的回调请求序列。

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

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

答案 1 :(得分:0)

已建议ECMAScript。

Chrome / Chromium(以及任何具有基于V8的最新JS引擎的产品)的工作实现似乎符合该规范。

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

更多信息:

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

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

答案 2 :(得分:0)

顶级 await(没有 asyncawait)还不是 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/