【问题标题】:Syntax for an async arrow function异步箭头函数的语法
【发布时间】:2017-08-15 07:15:28
【问题描述】:

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

async function foo() {
  // Do something
}

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

【问题讨论】:

  • 值得注意的是,至少 firefox 和 babel 确实让你这样做
  • var foo = async () => await Promise.resolve('ha'); - 工作得很好
  • it doesn't work 是没有意义的......你有错误吗?也许你做错了其他事情,没有“不起作用”的代码和对它如何不起作用的有意义的描述,只能猜测你做错了什么(或使用旧浏览器)跨度>
  • 这很可能是@Pointy,但它确实在当前的 firefox 和 chrome 以及 node.js (7.7.4) 中本机工作
  • ES2017 spec 有一个关于异步箭头函数定义@Pointy 的部分。

标签: javascript promise async-await arrow-functions


【解决方案1】:

异步箭头函数如下所示:

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
})

中使用async method

async foo() {
  // do something
}

【讨论】:

  • OP 似乎正在寻找一个命名的、异步的、箭头函数,这是您没有显示的一种语法。
  • 实际上,const foo = async () => {} 创建了一个名为 foo 的命名异步函数。以这种方式完成命名函数是完全可能的(只是没有提升)。在 ES2016+ 中,将匿名函数分配给变量,如果它在那里声明,则在变量之后命名它。
  • @BenjaminGruenbaum 请不要将其称为命名函数。在 js 中,命名匿名函数是一种非常特殊的语法 foo = function bar () {},在编写递归匿名函数时创建它是为了替换 arguments.callee。你有一个名为 foo 的变量,它是对函数的引用。
  • @slebetman 自 ES2015 以来,当您执行 const foo = async () => {} 时,函数的名称设置为 foo - ecma-international.org/ecma-262/6.0/…ecma-international.org/ecma-262/6.0/… - 请参阅 esdiscuss.org/topic/… 中的讨论
  • @FarisRayhan 和其他常量一样,变量somefunction的引用设置后就不能再改变了。 (它指向你的匿名异步函数。)
【解决方案2】:

这是将async箭头函数表达式分配给命名变量的最简单方法:

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

(注意这并不严格等同于async function foo() { }。除了the differences between the function keyword and an arrow expression,这个答案中的函数不是"hoisted to the top"。)

【讨论】:

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

立即调用异步箭头函数:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      基本示例

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

      【讨论】:

        【解决方案6】:

        你也可以这样做:

         YourAsyncFunctionName = async (value) => {
        
            /* Code goes here */
        
        }
        

        【讨论】:

        • 只有一个参数,你不需要括号。 YourAsyncFunctionName = async value => { /* 代码放在这里 */ }
        • @TakácsZsolt 这是一个偏好问题。贾斯汀所做的并没有错。我喜欢放括号以防我将来添加更多参数
        【解决方案7】:
        async function foo() {
          // do something
        }
        

        相当于:

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

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

        async function foo(arg1) {
          // do something
        }
        

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

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

        如果你用两个或更多参数调用 foo

        async function foo(arg1, arg2) {
          // do something
        }
        

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

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

        还有一个内部使用 await 的实际示例:

        const foo = async () => await Promise.resolve('done');
        

        【讨论】:

          【解决方案8】:

          我的异步函数

          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);
          });
          }
          

          【讨论】:

          • 请编辑您的答案以解释此代码如何回答问题并改进该问题已有的许多赞成的答案,以便对其他有类似问题的用户有用。在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。
          猜你喜欢
          • 1970-01-01
          • 2019-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-08
          • 1970-01-01
          • 2017-03-05
          相关资源
          最近更新 更多