Я экспериментирую с генераторами ES6 с помощью babel, и мне трудно понять, как (или если!) Я могу эффективно использовать функцию async на основе обратного вызова для вывода итератора.Генераторы ES6: преобразование обратных вызовов к итераторам
Предположим, я хочу иметь возможность писать функцию, которая принимает несколько URL-адресов, асинхронно загружает их и возвращает их, как только они будут загружены. Я хотел бы быть в состоянии написать что-то вроде следующего:
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);
}
Как я могу реализовать downloadUrls
? В идеале я хотел бы иметь возможность написать следующее:
var downloadUrls = function*(urls) {
for(let url of urls) {
$.ajax(url).done(function(data) {
yield data;
});
}
};
Это, конечно, не работает, так как `` выход «» в настоящее время вызывается внутри обратного вызова, а не непосредственно внутри генератора. Я могу найти множество примеров онлайн-пользователей, которые пытаются использовать то же самое, они либо not much transparent), требуют enabling browser/node flags, либо используют специфичные для узла функции/библиотеки. Библиотека, ближайшая к тому, что мне нужно, это task.js, но я не могу иметь даже самый простой пример для текущего Chrome.
Есть ли способ получить предполагаемое поведение с использованием стандартных и текущих функций (с текущим я имею в виду использование транспилеров, таких как babel, но без необходимости включения дополнительных флагов в браузере), или мне нужно ждать async/await
?
Как именно эти онлайн-объяснения не «прозрачны» для вас?Статья Дэвида Уолша является одной из лучших, которые я прочитал (но вам нужно будет прочитать всю серию курсов). – Bergi
Похоже, что предложение генератора асинхронного вызова https://github.com/jhusain/asyncgenerator (еще нигде не поддерживается НАСКОЛЬКО МНЕ ИЗВЕСТНО). –