在koajs中重定向之前,等待异步进程完成
Wait for async process to finish before redirect in koajs
我目前正在尝试生成一个子进程来处理一些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"事件。尽管您也可以监听其他子进程事件,如标准输出的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
}
你也可以使用辅助模块来帮助你:
相关文章:
- 在等待异步任务时永久循环
- 如何使用jQuery等待来自回调的异步调用
- 按顺序异步加载JS脚本(等待上一个脚本完成)
- 嵌套的异步/等待函数
- Electron 和 Babel 6 异步/等待抛出意外令牌
- 无法传输包含异步等待的TypeScript
- Javascript异步/等待ajax调用
- 异步/等待和 ES6 与生成器的产量之间的区别
- 使异步/等待循环按顺序执行
- 并行调用异步/等待函数
- 异步等待.js回调中的多个参数
- 节点和异步/等待,承诺...哪种解决方案最好
- 为什么从异步/等待提案中删除了 await*
- 异步/等待捕获被拒绝的承诺
- Node JS 动态集合 ajax 调用异步等待
- 如何实现Typescript异步等待模式:Promise在哪里
- Babel v6-transform-es2015类插件在松散模式下抛出SyntaxError:异步/等待的意外标识符
- try.catch未捕获异步/等待错误
- Array.map()中的Promises的JavaScript异步/等待
- 通天塔异步等待着