Tôi đang thử nghiệm máy phát điện ES6 với sự trợ giúp của babel và tôi gặp sự cố khi hiểu (hoặc nếu!) Tôi có thể sử dụng chức năng async dựa trên gọi lại hiệu quả để tạo ra trình lặp.Máy phát điện ES6: chuyển đổi callbacks thành vòng lặp
Giả sử tôi muốn có thể viết một hàm nhận một số url, tải xuống không đồng bộ và trả lại chúng ngay khi chúng được tải xuống. Tôi muốn để có thể viết một cái gì đó như sau:
let urls = ['http://www.google.com', 'http://www.stackoverflow.com' ];
for ({url, data} of downloadUrls(urls)) {
console.log("Content of url", url, "is");
console.log(data);
}
Làm thế nào tôi có thể thực hiện downloadUrls
? Lý tưởng nhất là tôi muốn để có thể viết như sau:
var downloadUrls = function*(urls) {
for(let url of urls) {
$.ajax(url).done(function(data) {
yield data;
});
}
};
Điều này tất nhiên không làm việc, kể từ '' năng suất '' đang được gọi bên trong một callback và không trực tiếp bên trong máy phát điện. Tôi có thể tìm thấy nhiều ví dụ trực tuyến về những người đang cố gắng giống nhau, họ là not much transparent), yêu cầu enabling browser/node flags hoặc sử dụng các tính năng/thư viện dành riêng cho nút. Thư viện gần nhất với những gì tôi cần có vẻ là task.js, nhưng tôi không thể có ngay cả ví dụ đơn giản nhất chạy trên Chrome hiện tại.
Có cách nào để có được hành vi dự định sử dụng các tính năng chuẩn và hiện tại, (Hiện tại tôi có thể sử dụng với các trình cắm như babel, nhưng không cần phải bật thêm cờ trên trình duyệt) hoặc tôi phải đợi async/await
?
Giải thích trực tuyến chính xác không "minh bạch" đối với bạn như thế nào?Bài viết walsh david là một trong những bài hay nhất tôi đã đọc (nhưng bạn sẽ cần phải đọc toàn bộ chuỗi khóa học) – Bergi
Dường như có liên quan: Đề xuất máy phát không đồng bộ https://github.com/jhusain/asyncgenerator (chưa được hỗ trợ ở bất kỳ đâu AFAIK). –