Стандартная рекомендация по определению того, нужно ли ждать события drain
на process.stdout
, является проверка того, возвращает ли он false при записи на него.Узел трубы к стандарту stdout - как я могу сказать, если он слит?
Как я могу проверить, подключил ли я к нему другой поток? Казалось бы, этот поток может испускать finish
, прежде чем весь вывод будет фактически записан. Могу ли я сделать что-то вроде этого?
upstreamOfStdout.on('finish', function(){
if(!process.stdout.write('')) {
process.stdout.on('drain', function() { done("I'm done"); });
}
else {
done("I'm done");
}
});
upstreamOfStdout.pipe(process.stdout);
Я предпочитаю ответ, который не зависит от внутренних элементов любых потоков. Просто учитывая, что потоки соответствуют интерфейсу потока узлов, каков канонический способ сделать это?
EDIT:
Больший контекст является оберткой:
new Promise(function(resolve, reject){
stream.on(<some-event>, resolve);
... (perhaps something else here?)
});
где stream
может быть process.stdout
или что-то другое, что имеет другой через поток поступает в него.
Моя программа выходит, когда вызывается resolve
. Я предполагаю, что код Promise
поддерживает программу до тех пор, пока все обещания не будут решены.
Я столкнулся с этой ситуацией несколько раз и всегда использовал хаки для решения проблемы (например, есть несколько частных членов в process.stdout
, которые являются полезными.) Но я действительно хотел бы решить это раз и навсегда (или узнать что это ошибка, поэтому я могу отследить проблему и исправить свои хаки, когда она разрешится, по крайней мере): как мне сказать, когда поток вниз по течению от другого закончен, обрабатывая его вход?
Проблема, с которой я сталкиваюсь, заключается в том, что, не слушая утечки, программа завершается прежде, чем все будет записано, но если я слушаю утечку, это иногда никогда не происходит. Я полагаю, что утечка испускается только тогда, когда данные буферизуются, но я не знаю, буферизованы ли данные или нет. Кажется, что они не документированы, чтобы спросить, закончил ли поток запись или нет. – shaunc
Буферизация происходит, когда метод 'write' возвращает' false', или, по крайней мере, это то, что указано в документации. Таким образом, событие «стока» происходит после такого случая. Имейте в виду, что ваша программа останется в живых, если у вас есть что-то значимое в цикле, который будет выполнен. Вы пытались прослушивать первый поток для события «end», а не последнего? – skypjack
Я считаю, что 'end' устарел для записываемых потоков -' finish' - это событие для прослушивания. Как вы можете видеть из моего примера кода, я слушаю, как закончить. Вы правы в том, что «буферизация происходит, когда метод write возвращает false» - текущий вопрос заключается в том, что делать, если вы не можете увидеть возврат 'write', потому что вы использовали канал для отправки данных. Например, записывает пустую строку после получения «финиша» от официально утвержденного восходящего потока? Я был бы очень признателен за ответ от сопровождающего или ссылку на то, что они написали, поскольку документ кажется неубедительным. – shaunc