В ожидании завершения обещания

1

Я создаю божество раздора и пытаюсь структурировать немного лучше.

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));
  • 1
    channel.send() принимает обещание как параметр?
  • 0
    @ Сирко, я так не думаю.
Показать ещё 1 комментарий
Теги:
discord.js
promise
axios

2 ответа

0
Лучший ответ

Самый простой способ - использовать 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, но для этого потребуется больше изменений в коде канала сообщений.

  • 0
    Вы имели в виду ES6?
  • 0
    Асинхронное ожидание - это вещь ES7
Показать ещё 5 комментариев
0

Ваш экспортированный командный файл не будет выполнен с момента 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 или что-то еще

  • 0
    Поэтому я сделал это изменение: axios.get(url).then(response => {return 1}); , но как мне получить это значение на другой стороне (со второй .then )?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню