等到承诺结束

时间:2018-02-10 11:17:04

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

我正在创建一个不和谐机器人,并尝试更好地构建。

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返回await,并且处理程序如下所示:

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

由于<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="//PRODUCT[@TYPE='1']/SUB[@CAT='1.1']/ITEM"> <xsl:if test="//PRODUCT[@TYPE='1']/SUB[@CAT='1.1']/ITEM /RULE (@BEGIN &lt;= current()/@BEGIN) and (@END &gt;= current()/@END)]"> <xsl:element name="MULTIPLE"> </xsl:element> </xsl:if> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>不在函数

中,导出的命令文件将无法执行

试试这个:

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) 命令或其他东西