我生成一個產生大量數據的子(我在這裏使用'ls -lR /'作爲示例)。我想一次讀取孩子的標準輸出100字節。node.js - 一次讀取子進程stdout 100字節
所以我想做的事:get100(),然後(process100)。然後(get100)。然後(process100)。然後(...
出於某種原因,這個代碼僅循環。 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
我不是真的在跑ls。我正在運行一些生成大量數據的專有.exe文件。我有一個消費者名單。我需要獲得前100個字節,添加一個標題,並將其發送給第一個消費者,第二個消費者的下一個100 +標題等。我試圖以異步方式執行此操作。 – GroovyDotCom
我明白了,由於exec.stdout是一個流,你可以堅持流。我正在寫一篇anwser。 – Shanoor