我开始编写Discord-Bot,他目前没有那么多功能。所以目前正在处理命令“!gif”,所以我用一个单词(这里是“蜘蛛”)键入该命令,作为响应,我得到一个带有蜘蛛标记的gif。
所以这是我的Discord-Code:
if(command == "gif"){
message.channel.send(modSearchGif.searchForGif("spider"));
}
modSearchGif是一个在此.js脚本中实现的模块。
模块看起来像这样:
var GphApiClient = require('giphy-js-sdk-core')
const client = GphApiClient(process.env.GIPHYTOKEN)
const searchForGif = (gifName) => {
client.search('gifs', {"q": gifName, "limit": 1})
.then((response) => {
var gif = response.data[0].url;
return gif;
})
.catch((err) => {
return err;
})
}
module.exports.searchForGif = searchForGif;
所以它真的很容易,如果命令“gif”在Discord-Channel中写入,Bot正在调用模块并给它参数“spider”。 然后客户端在giphy数据库中搜索此参数并返回一个json脚本。这是一个Promise,如果Promise被填满,gif将被返回到主语并将被发送到Discord-Channel。
这是问题,Promise调用是异步的,因此Discord命令“message.channel.send”在promise完全填充之前执行,因此消息未定义,我收到错误“无法发送空消息”。
我希望在返回gif时执行message.channel.send,而不是更早。
我真的不知道这件事。 你们有些想法吗?
提前谢谢!
答案 0 :(得分:1)
我会尝试这样的事情,因为then/catch
也会返回一个Promise
if(command == "gif"){
var searchPromise = modSearchGif.searchForGif("spider");
searchPromise.then((gif) => {
message.channel.send(gif);
})
}
为了实现这一目标,searchForGif
应该return
承诺,即
const searchForGif = (gifName) => {
return client.search('gifs', {"q": gifName, "limit": 1})
.then((response) => {
var gif = response.data[0].url;
return gif;
})
.catch((err) => {
return err;
})
}