我目前正在尝试使用NodeJS生成一个子进程来处理一些POST数据(使用Koa框架)。
理想情况下,我想在重定向之前等待子进程完成,但由于子进程是异步的,因此代码总是首先重定向。我已经试图解决这个问题很长一段时间了,想出了几种解决它的方法,但没有什么非常干净或可用。
处理此问题的最佳方法是什么?
以下是我的邮政路线的功能(使用koa-route中间件)。
function *task() {
var p = spawn("process", args);
p.on("data", function(res) {
// process data
});
p.stdin.write("input");
this.redirect('/'); // wait to execute this
}
答案 0 :(得分:4)
要等待在koa中完成同步任务/某事,你必须yield
一个带回调参数的函数。在这种情况下,要等待子进程完成,您必须发出"exit" event。虽然您也可以监听其他子进程事件,例如stdout的close
或end
事件。它们在退出之前发出。
因此,在这种情况下,yield function (cb) { p.on("exit", cb); }
应该可以使用Function::bind
yield p.on.bind(p, "exit");
function *task() {
var p = spawn("process", args);
p.on("data", function(res) {
// process data
});
p.stdin.write("input");
yield p.on.bind(p, "exit");
this.redirect('/'); // wait to execute this
}
您还可以使用帮助程序模块来帮助您:co-child-process