2017-10-24 15 views
5

This proposal cho thấy rằng async chức năng có thể sử dụng các chức năng của máy phát điện dưới mui xe, mặc dù tôi không thể tìm thấy một xác nhận điều này trong ES2017 spec.async/await native implementations

Hơn nữa, khi mẫu máy phát điện trở nên sai lầm trong Chrome/Node.js, async chức năng dường như không bị ảnh hưởng, điều này cho thấy GeneratorFunction không được sử dụng bởi AsyncFunction, ít nhất là trực tiếp:

Object.getPrototypeOf((function *() {}).prototype).next = null; 

(async() => { 
    return await Promise.resolve(1); 
})() 
.then(console.log); 

Cách chính xác async/await hoạt động trong các bản triển khai gốc hiện có?

Các triển khai có hiệu quả hơn khả năng với phương pháp Promise/máy phát điện được đề xuất theo đề xuất và thường được triển khai trong Babel và TypeScript không?

+0

Tôi tin rằng 'async - await' đang sử dụng chính xác cùng một cơ chế với lời hứa nhưng được phân tích cú pháp khác nhau bởi trình biên dịch. Trước khi thực hiện bản địa của họ có thể có được một trừu tượng (bắt buộc tìm mã không đồng bộ) tương tự như async chờ đợi bằng cách sử dụng máy phát điện và hứa hẹn như [giải thích ở đây đẹp] (https://curiosity-driven.org/promises-and-generators). – Redu

Trả lời

0

Theo như tôi biết, các chức năng của máy phát điện được sử dụng để mô phỏng hành vi của async/await. Khi bạn sử dụng kiểu chữ, nó sẽ được biên dịch thành javascript, và tùy thuộc vào thiết lập của bạn, nó sẽ biên dịch cú pháp async/await để triển khai trình tạo.

Thông tin thêm về việc biên soạn ở đây: https://basarat.gitbooks.io/typescript/docs/async-await.html

Vì vậy, bạn không nên lo lắng về việc sử dụng chúng trong nguyên cảo ở tất cả tôi nghĩ.

Tôi đoán việc triển khai gốc không sử dụng máy phát điện, về cơ bản nó chỉ là đường cú pháp để làm việc với các lời hứa.

+0

Có, câu hỏi là về việc triển khai bản địa (cấp độ thấp). Tôi tự hỏi liệu chúng có hiệu quả hơn máy phát điện + các nhà thầu hứa hẹn hay không. – estus

4

Chính xác như thế nào async/await hoạt động trong triển khai gốc hiện có?

Nếu chúng ta nhìn vào thực tế native implementation of async await in v8 chúng ta có thể thấy rõ cả lời hứa và máy phát điện làm cơ sở rõ ràng thực hiện async-chờ đợi, cũng trong parser nó nêu rõ bản chất phát-lời hứa của desugaring async-chờ đợi.

Về thông số ES, mặc dù thông số kỹ thuật không trực tiếp đề cập đến việc thực hiện thực tế chuyển ngữ cảnh thực thi, nó gợi ý sử dụng cùng một cơ chế Perform ! Call(promiseCapability.[[Resolve]]Promise.resolve đang sử dụng. Vì vậy, chủ quan gợi ý các "cơ chế" có thể để xử lý chạy bối cảnh thực thi toggling của asyncContext.

Hơn nữa, khi mẫu máy phát điện trở nên sai lầm trong Chrome/Node.js, chức năng async dường như không bị ảnh hưởng, điều này cho thấy GeneratorFunction không được sử dụng bởi AsyncFunction, ít nhất là trực tiếp:

Cả hai chức năng generatorasync trong thời gian chạy là hậu duệ của đối tượng Function, chúng không kế thừa từ một đối tượng khác, đó là lý do tại sao bạn không thấy các thay đổi đã cam kết.

Nhưng việc thực thi cấp bản gốc thực tế của đối tượng hoặc phương thức lưu trữ cụ thể không nhất thiết phải được kết nối với thực thi thời gian thực của đối tác được biên dịch và phụ thuộc của chúng. , kể từ %call% là triển khai cấp độ gốc.

Các triển khai có thực hiện nhiều hơn khả năng với phương pháp tiếp cận chức năng Promise/generator được đề xuất bởi đề xuất và thường được triển khai trong Babel và TypeScript không?

Nó phụ thuộc vào động cơ js và nó thực hiện tối ưu hóa mức biên soạn và deoptimizations, nhưng nó phụ thuộc vào sự thay đổi liên tục, đôi khi thực hiện bản địa là chậm hơn so với việc thực hiện bên lib thứ 3, như it happened with es5 map, forEach vs lodash counterparts, nhưng trong hầu hết các trường hợp thực hiện mức có nguồn gốc là chưa từng có do một cấp độ gần hơn với mã máy. Ví dụ ở đây là jsperf with 2x prevalence of async-await over regenerator được sử dụng trong babel.

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