我可以使用 async
关键字将 JavaScript 函数标记为“异步”(即返回一个承诺)。像这样:
async function foo() {
// Do something
}
箭头函数的等效语法是什么?
var foo = async () => await Promise.resolve('ha');
- 工作得很好
it doesn't work
是没有意义的......你得到一个错误吗?也许你做错了什么,没有“不起作用”的代码和对它如何不起作用的有意义的描述,只能猜测你做错了什么(或使用旧的浏览器)
异步箭头函数如下所示:
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
}
这是将 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"。)
foo = function myName () {}
。名称是 myName
,它被指定为只存在于匿名函数内部,而不是在外部任何地方定义。它的目的是在编写递归匿名函数时替换 arguments.callee
。
foo.name === 'foo'
)。但这仅仅是因为它在 const
*statement* 的初始化程序中——这意味着将其称为“命名异步箭头函数表达式”并不完全正确。您也是正确的,命名函数表达式的名称只是 bound 在它自己的主体内,但它也存储在函数的 name
属性中,这对于调试来说是很好的(并且通常是原因我会命名它们)。
fn.name
以及在范围内具有绑定(变量)的意义上。
立即调用异步箭头函数:
(async () => {
console.log(await asyncFunction());
})();
立即调用异步函数表达式:
(async function () {
console.log(await asyncFunction());
})();
带参数的异步箭头函数语法
const myFunction = async (a, b, c) => {
// Code here
}
基本示例
folder = async () => {
let fold = await getFold();
//await localStorage.save('folder');
return fold;
};
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');
你也可以这样做:
YourAsyncFunctionName = async (value) => {
/* Code goes here */
}
我的异步功能
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);
});
}
对于静态异步箭头函数,它的工作原理如下:
static myFunction = async () => {
// your code here
}
最简单的方法
const MyFunction = async ()=>{
// do something here
}
const foo = async () => {}
创建了一个名为foo
的命名异步函数。以这种方式完成命名函数是完全可能的(只是没有提升)。在 ES2016+ 中,将匿名函数分配给变量后,如果它在该变量中声明,则将其命名。foo = function bar () {}
,它是在编写递归匿名函数时创建来替换arguments.callee
的。你有一个名为foo
的变量,它是对函数的引用。const foo = async () => {}
时,函数的名称设置为foo
- ecma-international.org/ecma-262/6.0/… 和 ecma-international.org/ecma-262/6.0/… - 请参阅 esdiscuss.org/topic/… 中的讨论somefunction
的引用在设置后无法更改。 (它指向您的匿名异步函数。)