2016-04-27 2 views
0

Я недавно начал использовать функцию 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')); 
}); 

ответ

0

Вам не нужно ставить большую часть этого кода внутри Promise конструктора:

Q.spawn(function*() { 
    let fromStream = fs.createReadStream('x.txt'); 
    let toStream = fs.createWriteStream('y.txt'); 

    fromStream.pipe(toStream); 
    yield new Promise(resolve => { 
    toStream.on('end', resolve); 
    }); 
}); 

И, конечно, если вы ждали много потоков, то имело бы смысл факторизовать вызов конструктора обещание во вспомогательную функцию:

function endOf(stream) { 
    return new Promise(resolve => { 
    stream.on('end', resolve); 
    }); 
} 
+0

Хорошо, но что я действительно хочу знать, можно ли с получением потока и бегун затем неявно преобразует поток в PROMI как таковые. Проблемой, с которой я столкнулся, является 'someStream.pipe (outStream) .on ('end', => resolve())', похоже, не разрешает обещание. Я новичок в потоках nodejs. – Ajinkya

+0

Я не думаю, что Q является расширяемым в этом отношении, как Bluebird. Вы можете расширить встроенный 'Stream.prototype' с помощью метода' then', чтобы сделать потоки thenable, что должно позволить им быть 'yield'ed, но я не уверен, будет ли это хорошей практикой. – Bergi