ChatGPT解决这个技术问题 Extra ChatGPT

异步箭头函数的语法

我可以使用 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 的部分。

M
Mr. Polywhirl

异步箭头函数如下所示:

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

class 中使用 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 的引用在设置后无法更改。 (它指向您的匿名异步函数。)
A
Alexander Abakumov

这是将 async 箭头函数 expression 分配给 named 变量的最简单方法:

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 以及在范围内具有绑定(变量)的意义上。
M
Marvin Fischer

立即调用异步箭头函数:

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

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

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

S
Stephen M Irving

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

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

C
Chaurasia

基本示例

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

R
Ran Turner
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');

J
Justin E. Samuels

你也可以这样做:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

使用一个参数,您不需要括号。 YourAsyncFunctionName = async value => { /* 代码放在这里 */ }
@TakácsZsolt 这是一个偏好问题。贾斯汀所做的并没有错。我喜欢放括号以防我将来添加更多参数
s
suraj gholap

我的异步功能

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 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。
l
loic.isaac

对于静态异步箭头函数,它的工作原理如下:

static myFunction = async () => {
    // your code here
}

O
Okot Daniel

最简单的方法

   const MyFunction = async ()=>{
      // do something here
   }