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 và con người để phân tích cú pháp.
Nguồn
2016-02-26 17:15:29
Tôi chỉ có thể hình dung rằng nó giúp phân tích dễ dàng hơn ... –
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
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