async await в node.js
Форум — Web-development
Как вернуть непустой массив, если он заполняется в асинхронщине?
// test.js
function sleep(d) {
d += Date.now();
while (Date.now() < d) {};
}
for (let i = 0; i < 3; i++) {
process.stdout.write(`${process.argv[2]}${i}`);
sleep(1000);
}
// run-proc.js
const child_process = require("child_process");
function run_proc() {
let arr = [];
const proc = child_process.spawn("node", ["./test.js", "#"]);
proc.stdout.on("data", (data) => {
console.log(`${data}`);
arr.push(`${data}`);
});
return arr;
}
console.log(run_proc());
node run-proc.js
[]
#0
#1
#2
Up
Выводит err, out при выполнении и сохраняет в Buffer. Алсо, не ломает бинарный вывод.
const child_process = require("child_process");
function run_proc(cmd, args) {
return new Promise((resolve, reject) => {
const proc = child_process.spawn(cmd, args);
let stdout = [];
let stderr = [];
proc.stdout.on("data", (data) => {
console.log(`${data}`);
stdout.push(data);
});
proc.stderr.on("data", (data) => {
console.error(`${data}`);
stderr.push(data);
});
proc.on("close", (code) => {
console.log(`close: ${code}`);
resolve(Buffer.concat(stdout));
reject(Buffer.concat(stderr));
});
});
}
(async () => {
let arr = [];
await run_proc("node", ["./test.js", "#"])
.then(
stdout => {
console.log(`${stdout}`);
arr.push(stdout);
},
stderr => {
console.error(`${stderr}`);
}
);
console.log(Buffer.concat(arr).length);
})();