0

我开始编写一个 Discord-Bot,他目前没有那么多功能。所以目前我正在处理命令“!gif”,所以我用一个单词(这里是“spider”)键入该命令,作为响应,我得到一个带有蜘蛛标签的 gif。

所以这是我的不和谐代码:

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;

所以它真的很简单,如果在 Discord-Channel 中写入命令“gif”,Bot 正在调用模块并给它参数“spider”。然后客户端在giphy数据库中搜索这个参数,返回一个json脚本。这是一个 Promise,如果 Promise 完成,则 gif 将返回到 mainscript 并将发送到 Discord-Channel。

这是问题所在,Promise 调用是异步的,因此 Discord 命令“message.channel.send”在承诺完成之前执行,因此消息未定义,我收到错误“无法发送空消息”。

我希望在返回 gif 时执行 message.channel.send,而不是更早。

我真的对此一无所知。你们有什么想法吗?

先感谢您!

4

1 回答 1

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;
         })
}
于 2018-01-30T20:14:59.080 回答