2013-05-22 2 views
1

Прежде всего - мы находимся на незаметной территории здесь, поэтому, пока он работает в новейших firefoxes, документ на MDN не готов во время написания. Я исправлю MDN позже (возможно, есть много мест, которые нуждаются в исправлении), поэтому я предоставил glossary.ECMA harmony - обратный вызов генератору

Я хочу создать итератор из обратного вызова:

У меня есть класс, который строится с помощью двух обратных вызовов в качестве аргумента. Назовем экземпляр «слушателем». Этот слушатель затем повторно вызывает первый обратный вызов с некоторым аргументом, пока он не будет закончен, а затем вызовет второй обратный вызов один раз.

Я хочу обернуть вокруг него итератор, который дает каждому аргументу, что слушатель называется первым обратным вызовом, а затем бросает 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 

Обратите внимание, что я делаю все это в аддон Аддон SDK, так что я могу использовать promises и родственное вещество. И не нужны лекции о том, как браузеры не знают ничего, что я пытаюсь сделать;)

/изменить: если вы спросите, почему я не просто конвертирую все в код обратного вызова have a taste и скажу мне как преобразовать это в код на основе обратного вызова, не плача кровавыми слезами. Я просто включу свою основную функцию во что-то упомянутое here.

+0

Я все еще учусь ES6, но это звучит как две итерации (один является 'for..of', другой бы слушатель вызова функции обратного вызова повторно). Что вы хотите достичь с этим? – bfavaretto

+0

Что меня смущает, так это то, что вам кажется, что вы хотите смешивать синхронные и асинхронные операции таким образом, который может быть невозможен. – bfavaretto

+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 

Я хочу создать итератор из обратного вызова:

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

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

Ссылки

+0

спасибо, что показал мне, что, как хорошо; но я не понимаю, как я могу использовать его для чего хочу. –

Смежные вопросы