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