2016-02-26 14 views
5

Ví dụ, tại sao chức năng dưới đây cần phải có "async" .. không sử dụng đang chờ đủ cụ thể để trình biên dịch phân tích cú pháp mã mà không có sự mơ hồ?Tại sao chức năng javascript cần phải có từ khóa "async"? Không phải là từ khóa "đang chờ" đủ?

# Why do we need async here 
async function foo() { 
    var user = await getUser(user_id); 
    console.log(user); 
} 

Có phải vì lý do tương thích ngược không? (Tôi không thể nghĩ ra bất kỳ mã nào sử dụng bàn phím chờ đợi trong Javascript chuẩn ..)?

Chủ yếu là để rõ ràng để làm rõ rằng chức năng này sử dụng từ khóa async mới? Cảm ơn

+1

Tôi chỉ có thể hình dung rằng nó giúp phân tích dễ dàng hơn ... –

+1

Trong ví dụ này, nó sẽ không có ý nghĩa nhiều. Bạn đang chạy một cái gì đó không đồng bộ và sau đó yêu cầu nó chờ kết quả từ getUser. Nó có thể có ý nghĩa hơn trong bối cảnh của một hàm lớn hơn. – Neil

+0

Bạn có thể thấy blog này hữu ích: https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html Tôi đồng ý rằng đó có thể là vấn đề phân tích cú pháp. Từ blog: "Khi một hàm được khai báo là không đồng bộ thì có thể thực hiện thực thi mã gọi trong khi chờ đợi lời hứa được giải quyết." – scrappedcola

Trả lời

6

Từ góc độ ngôn ngữ, async/await từ khóa trong JavaScript được thiết kế rất chặt chẽ với cách họ làm việc trong C#.

Tôi có một bài đăng trên blog cũ mô tả một số cuộc thảo luận về lý do tại sao async được thêm rõ ràng trong C#: see Inferring "async" here. Tóm lại, việc thêm từ khóa là một thay đổi có khả năng phá vỡ đối với một ngôn ngữ; hãy tưởng tượng một ứng dụng hiện có sử dụng var await = false; hoặc một cái gì đó có tính chất đó.

Hoặc, ví dụ về cách điều này có thể mơ hồ hơn, var await = function() {};, được sử dụng làm await (x);. Nhìn vào cách sử dụng await (x);, trình biên dịch sẽ có một thời gian khó quyết định loại biểu thức đó là gì. Bạn có thể tranh luận rằng await là một từ khóa trừ khi có một biến trong phạm vi với tên đó, nhưng điều đó thực sự có nhiều lông.

Một giải pháp sạch hơn là giới thiệu một cặp từ khóa, vì vậy async (mà chỉ được sử dụng cho các chức năng và lambdas, và không phải là mơ hồ) cho phép từ khóa await, nhưng chỉ trong phạm vi đó. Có những lợi ích tương tự khi có máy phát điện biểu thị function*, thay vì chỉ có sự hiện diện của yield.

Nó không chỉ ít mơ hồ hơn (duy trì tính tương thích ngược với mã sử dụng await cho những thứ khác), nhưng cũng dễ dàng hơn cho cả phần mềm con người để phân tích cú pháp.

Các vấn đề liên quan