在koajs中重定向之前等待异步进程完成

时间:2014-05-25 07:15:14

标签: javascript node.js koa

我目前正在尝试使用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
}

1 个答案:

答案 0 :(得分:4)

要等待在koa中完成同步任务/某事,你必须yield一个带回调参数的函数。在这种情况下,要等待子进程完成,您必须发出"exit" event。虽然您也可以监听其他子进程事件,例如stdout的closeend事件。它们在退出之前发出。

因此,在这种情况下,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