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

Wait for async process to finish before redirect in koajs

本文关键字:异步 等待 进程 koajs 重定向      更新时间:2023-09-26

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

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

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

下面是我的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
}

要在koa中等待同步任务/某事完成,您必须yield一个接受回调参数的函数。在这种情况下,要等待子进程完成,必须触发"exit"事件。尽管您也可以监听其他子进程事件,如标准输出的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
}

你也可以使用辅助模块来帮助你: