ECMA和谐 - 回调发电机

时间:2013-05-22 14:31:16

标签: javascript generator yield ecmascript-6

首先 - 我们在这里处于未读区域,所以当它在最新的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

1 个答案:

答案 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();

<强>参考