Прежде всего - мы находимся на незаметной территории здесь, поэтому, пока он работает в новейших firefoxes, документ на MDN не готов во время написания. Я исправлю MDN позже (возможно, есть много мест, которые нуждаются в исправлении), поэтому я предоставил glossary.ECMA harmony - обратный вызов генератору
Я хочу создать итератор из обратного вызова:
У меня есть класс, который строится с помощью двух обратных вызовов в качестве аргумента. Назовем экземпляр «слушателем». Этот слушатель затем повторно вызывает первый обратный вызов с некоторым аргументом, пока он не будет закончен, а затем вызовет второй обратный вызов один раз.
Я хочу обернуть вокруг него итератор, который дает каждому аргументу, что слушатель называется первым обратным вызовом, а затем бросает StopIteration, как только вызывается второй.
Как это:
var magicIter = new MagicIter();
var listener = new Listener(magicIter.ready, magicIter.finished);
//on another thread, listener calls ready(1); ready(2); finished();
exhaustIterator(magicIter); //loops over magicIter and does stuff with it.
//listener has called finished, so magicIter has thrown StopIteration
//so the loop in exhaustIterator has stopped
Обратите внимание, что я делаю все это в аддон Аддон SDK, так что я могу использовать promises и родственное вещество. И не нужны лекции о том, как браузеры не знают ничего, что я пытаюсь сделать;)
/изменить: если вы спросите, почему я не просто конвертирую все в код обратного вызова have a taste и скажу мне как преобразовать это в код на основе обратного вызова, не плача кровавыми слезами. Я просто включу свою основную функцию во что-то упомянутое here.
Я все еще учусь ES6, но это звучит как две итерации (один является 'for..of', другой бы слушатель вызова функции обратного вызова повторно). Что вы хотите достичь с этим? – bfavaretto
Что меня смущает, так это то, что вам кажется, что вы хотите смешивать синхронные и асинхронные операции таким образом, который может быть невозможен. – bfavaretto
У меня есть одна функция, основанная на обратном вызове (слушатель), и функция, которая принимает итератор (он представлен здесь для цикла). Я изменю вопрос, чтобы уточнить это. Было бы огромной болью изменить все на код, основанный на обратном вызове, потому что 'исчерпывающий' делегирует на подфункции, которые также принимают итераторы и так далее. –