0

我目前正在尝试使用 NodeJS(使用 Koa 框架)生成一个子进程来处理一些 POST 数据。

理想情况下,我想在重定向之前等待子进程完成,但由于子进程是异步的,代码总是首先重定向。很长一段时间以来,我一直在尝试解决这个问题,并想出了一些骇人听闻的方法来部分解决它,但没有什么非常干净或可用。

处理这个问题的最佳方法是什么?

下面是我的发布路由的功能(使用 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
}
4

1 回答 1

4

要在 koa 中等待同步任务/某事完成,您必须使用yield一个带有回调参数的函数。在这种情况下,要等待子进程完成,您必须发出“退出”事件。尽管您也可以侦听其他子进程事件,例如stdoutcloseend事件。它们在退出之前发出。

所以在这种情况下yield function (cb) { p.on("exit", cb); }应该可以工作,我们可以减少yield p.on.bind(p, "exit");使用Function::bind

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

于 2014-05-25T08:57:48.783 回答