Cú pháp cho chức năng mũi tên async


497

Tôi có thể đánh dấu một hàm javascript là "async" (nghĩa là trả lại lời hứa) bằng asynctừ khóa. Như thế này:

async function foo() {
  // do something
}

Cú pháp tương đương cho các chức năng mũi tên là gì?


2
Điều đáng chú ý là ít nhất firefox và babel không cho phép bạn làm điều đó
Jaromanda X

15
var foo = async () => await Promise.resolve('ha');- hoạt động tốt
Jaromanda X

2
nói it doesn't worklà vô nghĩa ... bạn đang nhận được một lỗi? có lẽ bạn đang làm sai điều gì đó, không có mã "không hoạt động" và một mô tả có ý nghĩa về cách nó không hoạt động, chỉ có thể đoán rằng bạn đang làm gì đó sai (hoặc sử dụng trình duyệt cũ)
Jaromanda X

1
đó cũng có thể là @Pointy, nhưng nó hoạt động tự nhiên trong firefox và chrome và node.js hiện tại (7.7.4)
Jaromanda X

1
Các ES2017 đặc tả có một phần về định nghĩa async mũi tên chức năng @Pointy.
Khỉ Heretic

Câu trả lời:


843

Các chức năng mũi tên Async trông như thế này:

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

Các hàm mũi tên Async trông như thế này cho một đối số được truyền cho nó:

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

Các hàm mũi tên Async trông như thế này cho nhiều đối số được truyền cho nó:

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

Biểu mẫu ẩn danh cũng hoạt động:

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

Một khai báo hàm async trông như thế này:

async function foo() {
  // do something
}

Sử dụng chức năng async trong một cuộc gọi lại :

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

11
OP dường như đang tìm kiếm một chức năng mũi tên có tên là async, là một cú pháp mà bạn không hiển thị.
jfriend00

48
Trên thực tế, const foo = async () => {}tạo một hàm async có tên foo. Hoàn toàn có thể thực hiện các chức năng được đặt tên theo cách này (chỉ không cần cẩu). Trong ES2016 + gán một hàm ẩn danh cho một biến tên nó theo biến nếu nó được khai báo ở đó.
Benjamin Gruenbaum

5
@BenjaminGruenbaum Xin đừng gọi nó là hàm có tên. Trong js, một hàm ẩn danh có tên là một cú pháp rất cụ thể foo = function bar () {}được tạo ra để thay thế arguments.calleekhi viết các hàm ẩn danh đệ quy. Những gì bạn có có một biến có tên foolà một tham chiếu đến một hàm.
slebetman

18
@slebetman từ ES2015 khi bạn làm const foo = async () => {}tên của chức năng được thiết lập để foo- ecma-international.org/ecma-262/6.0/...ecma-international.org/ecma-262/6.0/... - xem thảo luận trong esdiscuss.org / topic /
Lôi

1
@FarisRayhan Cũng giống như các hằng số khác, tham chiếu của biến somefunctionkhông thể thay đổi sau khi được đặt. (Nó trỏ đến chức năng không đồng bộ ẩn danh của bạn.)
Qwerty

129

Đây là cách đơn giản nhất để gán biểu thứcasync hàm mũi tên cho một biến được đặt tên :

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

(Lưu ý rằng điều này không hoàn toàn tương đương với async function foo() { }. Bên cạnh sự khác biệt giữa functiontừ khóa và biểu thức mũi tên , hàm trong câu trả lời này không được "nâng lên đầu" .)


11
Lưu ý rằng một biểu thức hàm được đặt tên là một cú pháp rất cụ thể trong javascript. Đây KHÔNG phải là biểu thức hàm được đặt tên. Sử dụng các từ đúng là rất quan trọng để tránh nhầm lẫn sau này khi một cụm từ có thể phát triển có nghĩa là hai điều. FYI, một biểu thức chức năng được đặt tên là : foo = function myName () {}. Tên là myNamevà nó được chỉ định chỉ tồn tại bên trong hàm ẩn danh và không được xác định ở bất kỳ đâu bên ngoài. Mục đích của nó là thay thế arguments.calleekhi viết các hàm ẩn danh đệ quy.
slebetman

1
Tôi đã tranh chấp với bạn @slebetman về tính kỹ thuật, vì đây là biểu thức hàm (mũi tên) và bạn kết thúc bằng một hàm có tên (nghĩa là foo.name === 'foo'). Nhưng chỉ bởi vì nó nằm trong trình khởi tạo của một constcâu lệnh * * Kết hợp không hoàn toàn đúng khi gọi đây là "biểu thức hàm mũi tên async". Bạn cũng đúng rằng tên của biểu thức hàm được đặt tên chỉ bị ràng buộc bên trong cơ thể của chính nó, nhưng nó cũng được lưu trữ trong thuộc tính của hàm name, rất phù hợp để gỡ lỗi (và thường là lý do tôi đặt tên cho chúng).
Vaz

3
Nói cách khác, không có thứ gọi là "biểu thức hàm mũi tên được đặt tên", nhưng nó có thể trở thành "được đặt tên" bằng cách là một phần của const hoặc để cho câu lệnh (không chắc chắn về var vì cẩu), theo nghĩa là có một tên fn.namecũng như có một ràng buộc trong phạm vi (biến).
Vaz

41

Chức năng mũi tên Async được gọi ngay lập tức:

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

Biểu thức chức năng Async được gọi ngay lập tức:

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

18

Cú pháp hàm Async Arrow với các tham số

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

17

Ví dụ cơ bản

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

13

Bạn cũng có thể làm:

 YourAsyncFunctionName = async (value) => {

    /* Code goes here */

}

4
với một thông số bạn không cần dấu ngoặc đơn. YourAsyncFunctionName = async value => {/ * Mã ở đây * /}
Takács Zsolt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.