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而不使用异步吗?
非常感谢你!
答案 0 :(得分:9)
否。 await
运算符仅在async
函数中有意义。
编辑 - 详细说明:整个async
和await
交易可以被视为像LISP宏一样。该语法的作用是告知语言解释系统正在发生的事情,以便实际将周围代码的转换合成为基于Promise的回调请求序列。
因此,使用语法是编写显式Promise内容的隐式快捷方式,调用.then()
等。运行时必须知道函数是async
因为它知道函数内的async
表达式需要转换为通过生成器机制返回Promises。并且,由于重叠原因,函数声明上的async
装饰告诉语言这实际上是一个返回Promise的函数,并且它需要处理它。
所以,这很复杂。改进和扩展JavaScript的过程必须考虑到世界上存在难以想象的大量JavaScript代码的事实,因此几乎在所有情况下,没有新功能可以导致自2002年以来未触及的页面失败。
答案 1 :(得分:0)
已建议ECMAScript。
Chrome / Chromium(以及任何具有基于V8的最新JS引擎的产品)的工作实现似乎符合该规范。
该提案本身处于第3阶段。
更多信息:
答案 2 :(得分: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/