Javascript 在async.each中回调之前等待承诺

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)

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)
    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);
  });
}