まず第一に、私たちはここで未踏の領域にいるので、最新の Firefox で動作しますが、MDN のドキュメントは執筆時点では準備ができていません. MDN は後で修正します (修正が必要な場所がたくさんあるかもしれません) ので、用語集を提供します。
コールバックから Iterator を作成したい:
引数として 2 つのコールバックを使用して構築されたクラスがあります。インスタンスを「リスナー」と呼びましょう。次に、このリスナーは、リッスンが終了するまで、引数を指定して最初のコールバックを繰り返し呼び出し、次に 2 番目のコールバックを 1 回呼び出します。
これは、リスナーが最初のコールバックを呼び出した各引数を生成し、2 番目のコールバックが呼び出されるとすぐに 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
これはすべて Addon SDK アドオンで行っているため、Promise や関連するものを使用できます。そして、ブラウザが私がやろうとしていることを何も知らない方法についての講義は必要ありません;)
/編集: なぜすべてをコールバック ベースのコードに変換しないのかと聞かれたら、味を見て、血まみれの涙を流さずにそれをコールバック ベースのコードに変換する方法を教えてください。メイン関数をhere で言及されているものにラップします。