javascript - 在 async.each 回调之前等待 promise

标签 javascript callback async-await es6-promise async.js

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

Res.send 从未发生,回调似乎发生在连接完成运行之前。 Connect 成功返回一个 promise ,因为这

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.each 回调函数的问题,但研究还没有说明我应该如何调用它。是否可以在等待 promise 后使用 .then()

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

最佳答案

虽然您可以继续花费更多时间让 async.each() 正常工作,但我建议您放弃它并专门使用 async/ await 大大简化代码的语法:

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

查看 ssh2shell 文档,我认为您的 connect 功能也可以改进,以提高可读性和错误处理能力:

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

如果这仍然不适合您,请随时发表评论。

关于javascript - 在 async.each 回调之前等待 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53012313/

相关文章:

javascript - 预加载器不预加载并第二次加载页面

Javascript - 在 ES5 中扩展 ES6 类

r - 从 future 中调用 Shiny 的 JavaScript 回调

C++回调函数,静态函数内部调用成员变量

ios - Swift 编写一个带有返回值的 async/await 方法

c# - 不需要等待的异步任务方法

javascript - 如何在 Chrome 控制台中显示完整对象

javascript - Fullcalendar - 无法获取事件来显示 asp.net

callback - 戈朗 : evaluate variable in callback declaration

c# - 我们可以将异步方法转换为表达式主体吗?