Javascript 在async.each中回调之前等待承诺
Res.send从未发生,并且在connect完成运行之前,回调似乎已经发生。Connect正在成功返回承诺,因为Javascript 在async.each中回调之前等待承诺,javascript,callback,async-await,es6-promise,async.js,Javascript,Callback,Async Await,Es6 Promise,Async.js,Res.send从未发生,并且在connect完成运行之前,回调似乎已经发生。Connect正在成功返回承诺,因为 router.post('/runCommand', async function(req, res){ let results = []; async.each(req.body.requests, async function(request, callback){ const data = await connect(request.command)
router.post('/runCommand', async function(req, res){
let results = [];
async.each(req.body.requests, async function(request, callback){
const data = await connect(request.command)
await results.push(data);
await callback(null);
}, function(err){
if (!err) {
res.send(202, results)
}
})
})
很好。但是包含async.each来运行多个命令似乎是不正确的。我知道这是一个如何调用async的问题。每个回调函数都有一个问题,但研究并没有提供我应该如何调用它。在等待承诺后是否可以使用.then()
router.get('/topics', async function(req, res) {
console.log('in get');
const data = await connect(req.body.command);
await res.send(data);
});
虽然您可以继续投入更多时间使
async.each()
正常工作,但我建议您放弃它,只使用async
/wait
语法,这将大大简化您的代码:
function connect(command){
return new Promise(function(resolve) {
let host = {
server: {
host: "host",
port: "port",
userName: "user",
password: config.Devpassword
},
commands: [ command ]
};
var SSH2Shell = require ('ssh2shell'),
//Create a new instance passing in the host object
SSH = new SSH2Shell(host),
//Use a callback function to process the full session text
callback = function(sessionText){
console.log(sessionText)
resolve(sessionText);
}
SSH.connect(callback);
})
};
查看ssh2shell
文档,我认为您的connect
功能也可以改进,以提高可读性和错误处理能力:
router.post('/runCommand', async function (req, res) {
try {
const results = await Promise.all(
req.body.requests.map(({ command }) => connect(command))
);
res.send(202, results);
} catch ({ message, stack }) {
res.send(500, { error: message, stack });
}
})
如果这仍然对您不起作用,请随时发表评论。您对
async.each()
的回调是否被调用过?如果是,报告的错误是什么?这里没有足够的信息来确定你错在哪里。您确定POST请求的req.body
格式为{requests:[{command:…},…},…]}
吗?我可以通过connect函数中的控制台日志判断,它正在为req中的每个命令执行。是的,这是正确的格式。我遇到的问题是何时运行回调。我不是在等待连接完成跑步。因此,在正确定义结果数组之前,async.each将遍历req中的每个命令。虽然我不知道为什么res.send从未发生过。我以为它只会发送一系列未兑现的承诺,但实际上根本不会发送。请通过编辑您的答案提供connect()
的源代码。问题似乎就在那里。你在req.body.requests
中的每个请求都会得到console.log(sessionText)
?@PatrickRoberts我添加了connect()
的源代码,尽管我不认为问题存在。它还承诺罚款。当我只使用另一个函数运行一个命令时,它会在res.发送会话文本之前正确地等待它完成。我认为问题在于如何从async.eachthanks调用callback()!关于简化,你是100%正确的。我肯定会使用这个,但当我有更多时间时,可能会研究async.each。
const SSH2Shell = require('ssh2shell');
function connect (command) {
return new Promise((resolve, reject) => {
const host = {
server: {
host: 'host',
port: 'port',
userName: 'user',
password: config.Devpassword
},
commands: [command]
};
//Create a new instance passing in the host object
const SSH = new SSH2Shell(host);
SSH.on('error', reject);
SSH.connect(resolve);
});
}