ES6. Генераторы. Послесловие.

Доклад про генераторы породил довольно продолжительную дискуссию о их пригодности к использованию в чем либо, кроме ленивой генерации последовательностей.

Первой задачей, которая не была решена на митапе, была проблема чтения файла, представленного потоком, построчно, с использованием генераторов (речь, конечно же, про node.js).

Вторая проблема — пример с AJAX содержал слишком много зависимостей и „все кишки наружу“. Использовать в таком виде — невозможно.

В итоге мне удалось придумать решение для обоих проблем. По потоку „клиентский“ код получился такой:

var strm = require('fs').createReadStream(__filename);
readStreamByLine(strm, function *gen(nextPlease) {
 
   while(true) {
      var line = yield nextPlease();
      if (line === false) {
         return;
      }
      console.log('Got line: ' + line);
   }
});

А „синхронную асинхронность“ удалось упаковать до следующего кода:

asyncWrap(function *() {
 
    var currentTime;
    
    log('Lets wait 5 sec');
    
    currentTime = yield promiseFromTimer(5000);
    
    log('Current time is ' + currentTime + '. Now lets wait 10 sec');
    
    try {
        currentTime = yield exceptionFromTimer(10000);
        // Will never happen
        log('Current time is ' + currentTime + '. Ok then, lets stop');
    } catch(e) {
        log('Got exception: ' + e + ' at ' + (new Date()));
    }
    
    var fourtytwo = yield plusTwo(40);
    
    log('And... the meaning of life is ' + fourtytwo);
    
});

В последнем примере есть ограничение: асинхронная операция должна возвращать Promise. Все остальное трактуется как синхронный вызов.

Конкретная реализация оберток доступна в виде Gist’а, живой пример с „асинхронностью“ доступен на jsFiddle.