Eksperymentuję z generatorami ES6 z pomocą babel i nie mam pojęcia jak (lub jeśli!) Potrafię efektywnie wykorzystywać funkcję asynchroniczną opartą na oddzwanianiu do wyprowadzania iteratora.Generatory ES6: transformacja wywołań zwrotnych do iteratorów
Załóżmy, że chcę napisać funkcję, która pobiera wiele adresów URL, asynchronicznie pobrać je i odsyłać, gdy tylko zostaną pobrane. Chciałbym móc napisać coś jak następuje:
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);
}
Jak mogę wdrożyć downloadUrls
? Idealnie chciałabym móc napisać następujące:
var downloadUrls = function*(urls) {
for(let url of urls) {
$.ajax(url).done(function(data) {
yield data;
});
}
};
To oczywiście nie zadziała, ponieważ `` wydajnością „” jest wywoływana wewnątrz wywołania zwrotnego, a nie bezpośrednio wewnątrz generatora. Mogę znaleźć wiele przykładów online osób próbujących tego samego, są one albo not much transparent), wymagają enabling browser/node flags, albo używają specyficznych dla węzła funkcji/bibliotek. Biblioteką najbliższą temu, czego potrzebuję, wydaje się być task.js, ale nie mogę mieć nawet najprostszego przykładu uruchomionego w bieżącej przeglądarce Chrome.
Czy istnieje sposób na uzyskanie zamierzonego zachowania przy użyciu standardowych i aktualnych funkcji (Z obecnym mam na myśli używanie transpilatorów takich jak babel, ale bez potrzeby włączania dodatkowych flag w przeglądarce) lub czy muszę poczekać na async/await
?
Jak dokładnie te internetowe wyjaśnienia nie są dla ciebie "przezroczyste"?Artykuł Davida walsha jest jednym z najlepszych, jakie przeczytałem (ale musisz przeczytać całą serię oczywiście). – Bergi
Wydaje się to istotne: Propozycja generatora asynchronicznego https://github.com/jhusain/asyncgenerator (jeszcze nie jest obsługiwana AFAIK). –