1

首先——我们在这里处于无人涉足的领域,所以虽然它可以在最新的 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:如果您问我为什么不将所有内容都转换为基于回调的代码,请尝试一下并告诉我如何将其转换为基于回调的代码而不流泪。我将把我的主要功能包装到这里提到的东西中。

4

1 回答 1

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

我想从回调创建一个迭代器:

var callback_iterator =  new Stream( 1, function () {  
  return new Stream(1);  
  } );  

callback_iterator.add(callback_iterator.tail() ).print();

参考

于 2013-06-28T01:07:15.310 回答