Как получить обещание. Вернуть ответ API? - PullRequest
0 голосов
/ 12 июня 2019

TLDR: мой обещание. Ответ должен был быть вызван как в вызове API, так и в обещании.

Я пытаюсь получить возвращаемое значение из вызова API через Promise для простого сервера Express.js.

Кажется, это тема многих вопросов, но мне еще предстоит успешно адаптировать реализацию к этому случаю. Я также попробовал:

  • размещение вызова API в пределах resol ()
  • Асинхронные / ожидающие реализации (желающие вернуться)

Вот базовая структура рассматриваемого кода. Над разделом, где, вероятно, проблема, есть комментарий.

Promise

const externalModule = require('<route to module>');

let promise = new Promise(function(resolve,reject) {
    // This is probably where the problem is
    let returnValue = externalModule.apiCall(parameters);
    resolve(returnValue);
});

promise.then(function(returnValue) {
    console.log(returnValue);
});

Внешний модуль

module.exports = {
    apiCall: function(parameters) {
        apiCall(
            parameters,
            function(err, response) {
                if (err) {
                    console.error(err);
                    return;
                } else {
                    console.log("success");
                    return response
                }
            }
        )
    }
};

Если бы код работал правильно, мы бы увидели две строки. Один изнутри вызова API («success»), а другой из его возвращаемого значения. Поскольку значение undefined появляется перед «успехом», мы знаем, что функция разрешения была запущена до того, как вернулась функция над ней.

Логи из скорлупы

> undefined
> "success"

1 Ответ

2 голосов
/ 12 июня 2019

Вы не предоставляете способ использовать ответ от вызова API. Преобразуйте это обещание, а затем используйте его.

module.exports = {
  apiCall: function(parameters) {
    return new Promise((res, rej) => {
      apiCall(
        parameters,
        function(err, response) {
          if (err) {
            rej(err);
          } else {
            res(response);
          }
        }
      )
    });
  }
};

Тогда используйте это так

let promise = externalModule.apiCall(parameters);
...