Хотя основная цель ключевого слова доходности является предоставление итераторы по некоторым данным, он также весьма удобно использовать для создания асинхронных циклов:Как использовать доходность с помощью циклов обратного вызова?
function* bigLoop() {
// Some nested loops
for(...) {
for(...) {
// Yields current progress, eg. when parsing file
// or processing an image
yield percentCompleted;
}
}
}
Это можно вызывать асинхронно:
function big_loop_async(delay) {
var iterator = big_loop();
function doNext() {
var next = iterator.next();
var percent_done = next.done?100:next.value;
console.log(percent_done, " % done.");
// start next iteration after delay, allowing other events to be processed
if(!next.done)
setTimeout(doNext, delay);
}
setTimeout(doNext, delay);
}
Однако в современных javascript циклы обратного вызова стали довольно популярными. У нас есть Array.prototype.forEach
, Array.prototype.find
или Array.prototype.sort
. Все они основаны на обратном вызове, который был передан для каждой итерации. Я даже слышал, что рекомендуется использовать их, если можно, потому что они могут быть оптимизированы лучше, чем стандартные для циклов.
Я также часто использую циклы, основанные на обратном вызове, чтобы абстрагироваться от сложного шаблона цикла.
И вопрос в том, можно ли их превратить в итераторы yield
? В качестве простого примера рассмотрим, что я хотел, чтобы вы отсортировали массив асинхронно.
Would сортировка массива асинхронно (с помощью генератора и одного потока JS), есть какие-либо льготы? –
@DavinTryon Это пример *, примеры не предназначены для практического применения, но для того, чтобы их было легко понять. В любом случае, массив достаточно длинный, может занять слишком много времени для сортировки и может, например, отключить людей от вашего сервера или браузера пользователя с задержкой. –
@ TomášZato Это [хорошая статья] (http://raganwald.com/2016/05/07/javascript-generators-for-people-who-dont-give-a-shit-about-getting-stuff-done .html), что вы можете найти интересное (неудачное название). Итак, короткий ответ на ваш OP, да, это можно сделать. –