首先 - 我们在这里处于未读区域,所以当它在最新的firefox中工作时,MDN上的文档在编写时尚未准备就绪。我稍后会修复MDN(也许,有很多地方需要修复),所以我会提供glossary。
我想从回调中创建一个Iterator:
我有一个使用两个回调作为参数构造的类。我们将实例称为“监听器”。然后,这个监听器用一些参数重复调用第一个回调,直到它完成监听,然后调用第二个回调一次。
我想在它周围包含一个迭代器,它产生监听器调用第一个回调的每个参数,然后在调用第二个回调时立即抛出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插件中执行了所有操作,因此我可以使用promises及相关内容。并且不需要讲述浏览器如何不知道我正在尝试做什么;)
/ edit:如果你问为什么我不只是将所有内容转换为基于回调的代码have a taste并告诉我如何将其转换为基于回调的代码而不会哭泣流泪。我将把我的main函数包装成提到的here。
答案 0 :(得分:0)
我认为您可以使用stream.js执行类似的操作:
var s = new Stream( 10,
function ()
{
return new Stream();
}
);
// the head of the s stream is 10; the tail is the empty stream
s.print(); // prints 10
var t = new Stream( 10,
function ()
{
return new Stream( 20,
function ()
{
return new Stream( 30,
function ()
{
return new Stream();
}
);
}
);
}
);
/*
the head of the t stream is 10
its tail has a head which is 20
and a tail which has a head which is 30
and a tail which is the empty stream
*/
t.print(); // prints 10, 20, 30
我想从回调中创建一个Iterator:
var callback_iterator = new Stream( 1, function () {
return new Stream(1);
} );
callback_iterator.add(callback_iterator.tail() ).print();
<强>参考强>