异步箭头功能的语法

Bon*_*Oak 393 javascript promise async-await arrow-functions

我可以用async关键字将javascript函数标记为"async"(即返回一个promise).像这样:

async function foo() {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

箭头函数的等效语法是什么?

Bon*_*Oak 673

异步箭头函数如下所示:

const foo = async () => {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

匿名形式的作品,以及:

const foo = async evt => {
  // do something with evt
}
Run Code Online (Sandbox Code Playgroud)

异步函数声明如下所示:

const foo = async function() {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

回调中使用异步函数:

async function foo() {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,`const foo = async()=> {}`创建一个名为`foo`的命名异步函数.以这种方式完成命名函数是完全可能的(只是没有提升).在ES2016中,将一个匿名函数赋值给一个变量,如果在那里声明它,则将它命名为变量. (45认同)
  • @slebetman自ES2015以来你做`const foo = async()=> {}`这个函数的名字设置为`foo` - http://www.ecma-international.org/ecma-262/6.0/# sec-assignment-operators-runtime-semantics-evaluation和http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer-runtime-semantics-propertydefinitionevaluation-请参阅https://中的讨论esdiscuss.org/topic/name-anonymous-functions-on-property-assignments (17认同)
  • OP似乎正在寻找一个命名的异步箭头函数,这是您未显示的一种语法. (10认同)
  • @BenjaminGruenbaum请不要将其命名为命名函数.在js中,一个命名的匿名函数是一个非常特殊的语法`foo = function bar(){}`,它是在编写递归匿名函数时替换`arguments.callee`而创建的.你所拥有的是一个名为`foo`的变量,它是对函数的引用. (5认同)
  • @FarisRayhan 就像其他常量一样,变量`somefunction` 的引用在设置后不能更改。(它指向您的匿名异步函数。) (2认同)

小智 114

分配一个异步箭头功能最简单的方式表达一个名为变量:

const foo = async () => {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

当当!

(注意,这并不完全等同于async.除了关键字和箭头表达式之间的差异async function foo() { }外,此答案中的函数不会"被提升到顶部".)

  • 请注意,命名函数表达式是javascript中非常特定的语法.这不是命名函数表达式.使用正确的单词对于避免以后混淆是很重要的,因为一个短语可以演变成两个东西.FYI,一个命名函数表达式是:`foo = function myName(){}`.名称是`myName`,它被指定为仅存在于匿名函数内,而不是在外部任何地方定义.它的目的是在编写递归匿名函数时替换`arguments.callee`. (9认同)
  • 换句话说,没有"命名箭头函数表达式"这样的东西,但是它可以通过成为const的一部分而被"命名"或者让_statement_(因为提升而不确定var)名称`fn.name`以及范围内的绑定(变量). (3认同)
  • 我正要在技术问题上与你争论 @slebetman,因为这是一个(箭头)函数表达式,并且你最终得到一个命名函数(即 `foo.name === 'foo'`)。但这只是因为它位于 `const` *语句*的初始化程序中,这意味着将其称为“命名异步箭头函数表达式”并不完全正确。您也是正确的,命名函数表达式的名称仅在其自己的主体内 _bound_ ,但它也存储在函数的“name”属性中,这对于调试很有用(并且通常是我命名它们的原因) 。 (2认同)

Mih*_*ail 26

立即调用异步箭头功能:

(async () => {
    console.log(await asyncFunction());
})();
Run Code Online (Sandbox Code Playgroud)

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

(async function () {
    console.log(await asyncFunction());
})();
Run Code Online (Sandbox Code Playgroud)


Ran*_*ner 25

async function foo() {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

相当于:

const foo = async () => {
   // do something
}
Run Code Online (Sandbox Code Playgroud)

使用一个参数进行调用,foo如下例所示:

async function foo(arg1) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

相当于foo这样调用(两种方式都可以接受,因为括号是可选的,但在只提供一个参数时不是必需的)

const foo = async arg1 => {
  // do something
}

const foo = async (arg1) => {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

如果您foo使用两个或多个参数进行调用

async function foo(arg1, arg2) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

相当于:(现在需要括号)

 const foo = async (arg1, arg2) => {
    // do something
 }
Run Code Online (Sandbox Code Playgroud)

对于内部使用await 的实际示例:

const foo = async () => await Promise.resolve('done');
Run Code Online (Sandbox Code Playgroud)


Cha*_*sia 20

基本示例

folder = async () => {
    let fold = await getFold();
    //await localStorage.save('folder');
    return fold;
  };
Run Code Online (Sandbox Code Playgroud)


Jus*_*els 12

你也可以这样做:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}
Run Code Online (Sandbox Code Playgroud)

  • 有一个参数,你不需要括号.YourAsyncFunctionName = async value => {/*代码在这里*/} (4认同)
  • @TakácsZsolt 这是一个偏好问题。贾斯汀所做的并没有错。我喜欢加上括号,以防将来添加更多参数 (3认同)

cod*_*ror 8

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

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


小智 7

我的异步功能

const getAllRedis = async (key) => {
  let obj = [];

  await client.hgetall(key, (err, object) => {
    console.log(object);
    _.map(object, (ob)=>{
      obj.push(JSON.parse(ob));
    })
    return obj;
    // res.send(obj);
});
}
Run Code Online (Sandbox Code Playgroud)

  • 请编辑您的答案,以解释此代码如何回答问题并改进该问题已有的许多已投票答案,以便它对遇到类似问题的其他用户有用。Stack Overflow 上不鼓励仅提供代码答案,因为它们没有解释它如何解决问题。 (2认同)

Aud*_*ses 7

const asynchronousFunction = async () => {
  // do something;
  // await something else;
}
Run Code Online (Sandbox Code Playgroud)