Giphy API в асинхронной функции Discord Bot

Я начал программировать Discord-Bot, у него сейчас не так много функций. Итак, в данный момент я работаю над командой "! Gif", поэтому я набираю эту команду словом (здесь это "паук"), в ответ я получаю gif с тегом Spider.

Итак, вот мой Discord-код:

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, бот вызывает модуль и присваивает ему параметр "паук". Затем клиент ищет этот параметр в базе данных giphy и возвращает скрипт json. Это Обещание, если Обещание выполнено, gif возвращается в основной сценарий и отправляется на Discord-Channel.

Вот проблема, вызов Promise является асинхронным, поэтому команда Discord "message.channel.send" выполняется до того, как обещание выполнено, поэтому сообщение не определено, и я получаю сообщение об ошибке "Не удается отправить пустое сообщение".

Я хочу, чтобы message.channel.send выполнялся при возврате gif, а не раньше.

Я действительно понятия не имею об этом. Ребята, есть идеи?

Заранее спасибо!

1 ответ

Решение

Я бы попробовал что-то вроде этого, как then/catch также возвращает обещание

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;
         })
}
Другие вопросы по тегам