等到承诺完成

Waiting till the promise is finished

我正在创建一个 discord 机器人,并尝试构建更好的结构。

message.channel.send(require('./commands/' + inputs[0] + '.js')(inputs));

这将需要一个文件并将 returned 消息发送到频道。这是此类文件的示例:

module.exports = commands => {
let returnM = '';
axios.get(some url).then(response => {
        returnM = response.data.whatever;
    }).catch(error => {
        returnM = "API error.";
    });
}
return returnM;

我得到一个 "cannot display empty message",因为该函数还没有 returned 任何东西,消息发送者已经在尝试执行。怎么能这样呢,它会一直等待,直到响应被拉取和处理?

编辑: 知道了!谢谢您的帮助! 使导出的函数异步,整个 axios 拉动 return 等待,处理程序看起来像这样:

require('./commands' + inputs[0] + '.js')(inputs).then(m => message.channel.send(m));

最简单的方法是使用 ES7 Async Await...

module.exports = async commands => {
  return await axios.get(some url).then(response => {
    return response.data.whatever;
  }).catch(error => {
    return "API error.";
  });
}

您需要在函数声明之前添加 async 关键字,并在要等待的调用之前添加 await 关键字。这样,只要您在函数调用前加上 await 关键字,异步函数就会暂停并等待被调用的函数到达 return。这允许您以同步方式编写异步代码。

或者,您可以使用 Promise,但这需要对您的消息通道代码进行更多更改。

您导出的命令文件将无法执行,因为 return returnM; 在函数之外

试试这个:

// export a function that when called returns
// a promise that resolves to `whatever`

module.exports = commands => axios.get(url).then(
  response => response.data.whatever,
  error => 'API error.'
)

.

// when required, called and then resolved,
// calls the send command with the resolved value `whatever`
require('./commands/' + inputs[0] + '.js')(inputs).then(message.channel.send)

当心是否有人试图调用 ../index 命令或其他东西