Sto sperimentando con i generatori ES6 con l'aiuto di babel e ho difficoltà a capire come (o se!) Posso utilizzare efficacemente la funzione asincrona basata sulla richiamata per emettere un iteratore.Generatori ES6: trasformazione dei callback agli iteratori
Diciamo che voglio essere in grado di scrivere una funzione che accetta un numero di URL, scaricarli in modo asincrono e restituirli non appena vengono scaricati. Mi piacerebbe essere in grado di scrivere qualcosa di simile a quanto segue:
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);
}
Come posso implementare downloadUrls
? Idealmente mi vorrebbe poter scrivere il seguente:
var downloadUrls = function*(urls) {
for(let url of urls) {
$.ajax(url).done(function(data) {
yield data;
});
}
};
Questo ovviamente non funziona, poiché `` resa '' viene richiamato all'interno di un callback e non direttamente all'interno del generatore. Sono in grado di trovare molti esempi online di persone che provano lo stesso, sono not much transparent), richiedono enabling browser/node flags o utilizzano funzionalità/librerie specifiche del nodo. La libreria più vicina a ciò di cui ho bisogno sembra essere task.js, ma non riesco ad avere nemmeno l'esempio più semplice eseguito su Chrome corrente.
C'è un modo per ottenere il comportamento desiderato utilizzando le funzionalità standard e attuali, (Con l'attuale intendo utilizzabile con transpiler come babel, ma senza la necessità di abilitare le bandiere aggiuntive sul browser) o devo aspettare per async/await
?
In che modo esattamente le spiegazioni online non sono "trasparenti" per te?L'articolo di David Walsh è uno dei migliori che ho letto (ma è necessario leggere l'intera serie ovviamente) – Bergi
Sembra rilevante: proposta generatore asincrono https://github.com/jhusain/asyncgenerator (non supportato ancora da nessuna parte PER QUANTO NE SO). –