Я создаю божество раздора и пытаюсь структурировать немного лучше.
message.channel.send(require('./commands/' + inputs[0] + '.js')(inputs));
Для этого потребуется файл и отправить возвращенное сообщение на канал. Это пример такого файла:
module.exports = commands => {
let returnM = '';
axios.get(some url).then(response => {
returnM = response.data.whatever;
}).catch(error => {
returnM = "API error.";
});
}
return returnM;
Я получаю сообщение "can not show empty message", потому что функция еще ничего не вернула, и отправитель сообщения уже пытается выполнить. Как это можно сделать, он ждет, пока реакция не потянется и не обработана?
EDIT: Получил IT! Спасибо за помощь! Сделал экспортированную функцию async и ожидание возврата axios, и обработчик выглядит следующим образом:
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
ключевого слова функции асинхронной сделает паузу и ждать, вызываемая функция возвращала. Это позволяет вам синхронно писать асинхронный код.
В качестве альтернативы вы можете использовать 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
команду ../index
или что-то еще
axios.get(url).then(response => {return 1});
, но как мне получить это значение на другой стороне (со второй .then
)?
channel.send()
принимает обещание как параметр?