【问题标题】:Waiting till the promise is finished [duplicate]等到承诺完成[重复]
【发布时间】:2018-07-21 01:40:19
【问题描述】:

我正在创建一个不和谐的机器人,并尝试将结构做得更好。

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

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

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

我收到“无法显示空消息”,因为该函数尚未返回任何内容,并且消息发送者已经在尝试执行。怎么会这样,它会等待,直到响应被拉出并处理?

编辑: 知道了!谢谢您的帮助! 使导出的函数 async 和整个 axios pull return await 和 handler 看起来像这样:

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

【问题讨论】:

  • channel.send() 是否接受承诺作为参数?
  • @Sirko 我不这么认为。
  • 简短的回答是:不能同步返回结果的函数根本不返回结果,至少不直接返回。它们返回一个 Promise,Promise 在准备好时返回结果。您使用then() 将回调附加到 Promise 并在其准备就绪时对其结果进行处理。

标签: javascript node.js promise axios discord.js


【解决方案1】:

最简单的方法是使用 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 关键字时,异步函数就会暂停并等待被调用函数返回。这允许您以同步方式编写异步代码。

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

【讨论】:

  • 你说的是 ES6 吗?
  • 异步,等待是 ES7 的东西
  • 不,我的意思是 ES7,这就是我非常具体的原因。从 Node.js v7 开始就可以使用(我相信)。
  • 我实际上得到了Promise { <pending> }
  • 我自己并没有实际测试过,我只是用你的例子回答你的问题。我一直在使用 async await,原理是合理的,但你可能需要稍微调整一下代码
【解决方案2】:

您导出的命令文件将无法执行,因为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 命令或其他东西

【讨论】:

  • 所以我做了这个更改:axios.get(url).then(response => {return 1});,但是我如何在另一边获得这个值(第二个.then)?
猜你喜欢
  • 2021-05-12
  • 2022-01-12
  • 2020-11-20
  • 2017-06-17
  • 2016-10-16
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多