首先——我们在这里处于无人涉足的领域,所以虽然它可以在最新的 Firefox 中运行,但在撰写本文时,MDN 上的文档还没有准备好。稍后我会修复 MDN(可能有很多地方需要修复),所以我会提供一个词汇表。
我想从回调创建一个迭代器:
我有一个使用两个回调作为参数构造的类。我们称这个实例为“监听器”。这个监听器然后用一些参数重复调用第一个回调,直到它完成监听,然后调用第二个回调一次。
我想围绕它包装一个迭代器,它会产生每个参数,侦听器调用第一个回调时使用,然后在调用第二个回调时立即抛出 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和相关的东西。并且不需要关于浏览器如何不知道我正在尝试做什么的讲座;)
/edit:如果您问我为什么不将所有内容都转换为基于回调的代码,请尝试一下并告诉我如何将其转换为基于回调的代码而不流泪。我将把我的主要功能包装到这里提到的东西中。