我正在使用NodeJs execFile()启动守护进程。我已经将回调包装在一个承诺中,以便在应用程序的其他部分异步使用它。
我知道回调完成后会发出err / result。因此,当守护进程失败时,promise会正确拒绝错误。
问题::当守护进程正确启动时,promise无法解决任何问题,因为回调尚未完成。
一旦守护进程停止,就接收到响应,因为那是回调生命周期的结尾。但这为时已晚。
问题:如何跟踪回调的生命周期以使承诺得以解决(callback_in_progress)?
我需要使用节点事件模块来创建事件侦听器吗?
这些是模块中的2种方法。第一个效果很好,但是第二个是我遇到问题的地方。
const { execFile } = require('child_process');
const path = require('path');
const binaryPath = require('./BinaryPaths')
const mcUtil = path.join(binaryPath, 'multichain-util');
const mcd = path.join(binaryPath, 'multichaind');
module.exports = {
createChain: (chainName) => {
return new Promise((resolve, reject) => {
execFile(mcUtil, ['create', chainName], (err, res) => {
err ? reject(err) : resolve(res);
});
});
},
startMultichain: (chainName) => {
return new Promise((resolve, reject) => {
execFile(mcd, [chainName, 'daemon'], (err, res) => {
err ? reject(err.message) : resolve(res);
});
});
},
};
答案 0 :(得分:1)
您可以围绕 Promise 创建包装,以在代码中同步获取承诺状态,如下所示:
class StatefulPromise extends Promise {
constructor (executor) {
super((resolve, reject) => executor(
(val) => {
resolve(val)
this._state = 'Resolved'
},
(err) => {
reject(err)
this._state = 'Rejected'
},
))
this._state = 'Processing'
}
get state () {
return this._state
}
}
// Create a promise that resolves after 3 sec
var myStatefulPromise = new StatefulPromise((resolve, reject) => {
setTimeout(() => resolve(), 3000)
})
// Log the state of above promise every 500ms
setInterval(() => console.log(myStatefulPromise.state), 500)
答案 1 :(得分:0)
更多搜索后,我找到了解决该问题的解决方案,该解决方案发布在其他线程中。这很简单。我只需要使用spawn()而不是execFile()。这将流传输数据,而不是仅在回调完成后才解析。
此处的解决方案线程: get execFile stdOut on chunks