异步箭头功能的语法


496

我可以使用async关键字将javascript函数标记为“异步”(即返回承诺)。像这样:

async function foo() {
  // do something
}

箭头功能的等效语法是什么?


2
值得注意的是,至少Firefox和
Babel

15
var foo = async () => await Promise.resolve('ha');-工作正常
Jaromanda X

2
这句话it doesn't work毫无意义...您遇到错误了吗?也许您在做其他事情,而没有“不起作用”的代码以及对它不起作用的有意义的描述,只能猜测您在做错事情(或使用旧的浏览器)
Jaromanda X

1
可能是@Pointy,但是它确实可以在当前的firefox和chrome和node.js(7.7.4)中正常工作
Jaromanda X

1
ES2017规范对异步箭头函数定义@Pointy的部分。
异端猴子

Answers:


840

异步箭头函数如下所示:

const foo = async () => {
  // do something
}

传递给它的单个参数的异步箭头函数如下所示:

const foo = async evt => {
  // do something with evt
}

对于传递给它的多个参数,异步箭头函数如下所示:

const foo = async (evt, callback) => {
  // do something with evt
  // return response with callback
}

匿名形式的作品,以及:

const foo = async function() {
  // do something
}

异步函数声明如下所示:

async function foo() {
  // do something
}

回调中使用异步函数:

const foo = event.onCall(async () => {
  // do something
})

11
OP似乎正在寻找一种命名的异步箭头功能,这是您未显示的一种语法。
jfriend00

48
实际上,const foo = async () => {}创建了一个名为的名为async的异步函数foo。完全有可能以这种方式执行命名函数(只是不进行提升)。在ES2016 +中,如果在变量中声明了匿名函数,则将匿名函数分配给变量后将其命名。
本杰明·格林鲍姆

5
@BenjaminGruenbaum请不要将其命名为function。在js中,命名匿名函数是一种非常特殊的语法foo = function bar () {}arguments.callee在编写递归匿名函数时会被替换。您所拥有的是一个名为的变量foo,该变量是对函数的引用。
slebetman

18
因为ES2015 @slebetman当你这样做const foo = async () => {}的函数的名称设置为foo- ecma-international.org/ecma-262/6.0/...ecma-international.org/ecma-262/6.0/... -见讨论esdiscuss.org / topic /…
Benjamin Gruenbaum

1
@FarisRayhan与其他常量一样,设置变量somefunction后不能更改其引用。(它指向您的匿名异步函数。)
Qwerty

129

分配一个简单的方法async箭头函数表达式命名变量:

const foo = async () => {
  // do something
}

(请注意,这并不严格等同于async function foo() { }。除了关键字和箭头表达式之间的区别function之外,此答案中的函数没有“提升到顶部”。)


11
请注意,命名函数表达式是javascript中非常特定的语法。这不是命名函数表达式。使用正确的单词很重要,可以避免以后当一个短语演变为两件事时产生混淆。仅供参考,命名函数表达式为:foo = function myName () {}。名称是myName并且被指定为仅存在于匿名函数内部,并且未在外部定义。目的是arguments.callee在编写递归匿名函数时进行替换。
slebetman

1
我要就技术性向您@slebetman提出争议,因为这是一个(箭头)函数表达式,并且您最终得到一个命名函数(即foo.name === 'foo')。但这仅仅是因为它在const* statement * 的初始值设定项中,这意味着将其称为“命名的异步箭头函数表达式”是不正确的。您还正确的是,命名函数表达式的名称仅绑定在其自身的主体内,但也存储在函数的name属性中,这对于调试非常有用(并且通常是我将其命名的原因)。
Vaz

3
换句话说,没有“命名箭头函数表达式”之类的东西,但是它可以通过成为const或let 语句的一部分而变得“命名” (由于提升而不确定var),名称fn.name以及作用域(变量)的绑定。
Vaz

41

立即调用异步箭头功能:

(async () => {
    console.log(await asyncFunction());
})();

立即调用异步函数表达式:

(async function () {
    console.log(await asyncFunction());
})();

18

带参数的异步箭头函数语法

const myFunction = async (a, b, c) => {
   // Code here
}

17

基本范例

folder = async () => {
    let fold = await getFold();
    //await localStorage.save('folder');
    return fold;
  };

13

您也可以这样做:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

4
一个参数,您不需要括号。YourAsyncFunctionName =异步值=> {/ *码放在这里* /}
塔卡克斯泽索特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.