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;
})
}