等到承诺完成
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
命令或其他东西
我正在创建一个 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
命令或其他东西