Я недавно начал использовать функцию Q.spawn
для запуска генераторов, которые дают обещания. Это хорошо работает в браузерах, где поддержка потоков еще не приземляется, но в случае узла у нас есть потоки. Если вы используете потоки внутри функции генератора и хотели бы получить один раз, когда поток записи будет выполнен, ваш код станет не таким чистым.Выходные потоки в функциях генератора
Q.spawn(function*() {
yield new Promise(resolve => {
let fromStream = fs.createReadStream('x.txt');
let toStream = fs.createWriteStream('y.txt');
toStream.on('end',() => resolve());
fromStream.pipe(toStream);
});
});
Это работает, но как только я начинаю иметь дело с большим количеством потоков, код становится действительно уродливым. Можно ли сделать это так же просто, как следующий фрагмент ?.
someGeneratorFuncRunner(function*() {
yield fs.createReadStream('x.txt')
.pipe(fs.createWriteStream('y.txt'));
});
Хорошо, но что я действительно хочу знать, можно ли с получением потока и бегун затем неявно преобразует поток в PROMI как таковые. Проблемой, с которой я столкнулся, является 'someStream.pipe (outStream) .on ('end', => resolve())', похоже, не разрешает обещание. Я новичок в потоках nodejs. – Ajinkya
Я не думаю, что Q является расширяемым в этом отношении, как Bluebird. Вы можете расширить встроенный 'Stream.prototype' с помощью метода' then', чтобы сделать потоки thenable, что должно позволить им быть 'yield'ed, но я не уверен, будет ли это хорошей практикой. – Bergi