Я порождаю ребенка, который производит много данных (я использую здесь 'ls -lR /' здесь в качестве примера). Я хочу асинхронно читать stdout ребенка по 100 байт за раз.node.js - чтение дочернего процесса stdout 100 байт за один раз
Так что я хочу сделать: get100(), а затем (process100) .then (get100) .then (process100) .then (...
По какой-то причине этот код только петли. 3 раза и я перестану получать читаемым события. Я не могу понять, почему?
var Promise = require('bluebird');
var spawn = require("child_process").spawn;
var exec = spawn("ls", [ "-lR", "/"]);
var get100 = function() {
return new Promise(function(resolve, reject) {
var tryTransfer = function() {
var block = exec.stdout.read(100);
if (block) {
console.log("Got 100 Bytes");
exec.stdout.removeAllListeners('readable');
resolve();
} else console.log("Read Failed - not enough bytes?");
};
exec.stdout.on('readable', tryTransfer);
});
};
var forEver = Promise.method(function(action) {
return action().then(forEver.bind(null, action));
});
forEver(
function() { return get100(); }
)
Это, по-видимому, очень запутанный способ сделать простой 'ls'. Что вы пытаетесь сделать? Что вы делаете со 100 байтами, которые вы читаете? – Shanoor
Я на самом деле не работает. Я запускаю запатентованный .exe, который генерирует тонну данных. У меня есть список потребителей. Мне нужно получить первые 100 байт, добавить заголовок и отправить его первому пользователю, следующий 100 + заголовок для второго потребителя и т. Д. Я пытаюсь сделать это асинхронно. – GroovyDotCom
Я вижу, поскольку exec.stdout - это поток, вы можете придерживаться потоков. Я пишу anwser. – Shanoor