Как вернуть ответ на запрос Post из функции в NodeJS? - PullRequest
1 голос
/ 14 февраля 2020

У меня есть функция в моем проекте, которая обрабатывает большинство моих запросов API (см. Упрощенный черновик ниже)

function sendRequest(){

    var reqbody;
    var resp;

    reqbody = unimportantRandomFunction();

    request.post({
        headers: {  'content-type'  : 'application/xml',
                    'accept'        : 'application/xml'},
        url: process.env.APIURL,
        body: reqbody
    }, function(error, response, body){
        resp = convert.xml2js(body, {compact:true});
    });

    return resp;
}

Проблема, с которой я сталкиваюсь, заключается в том, что request.post асинхронный и к тому времени, когда я получаю ответ, неопределенное значение уже возвращено. Я попытался поэкспериментировать с обещаниями (что-то, для чего я совершенно новичок), но, очевидно, я также не могу поместить свой возврат в блок .then, потому что этот возврат не будет принадлежать функции sendRequest (исправьте меня, если я ошибаюсь). Какие-нибудь идеи, где я мог бы поместить свое возвращаемое заявление, чтобы заставить это работать, то есть ждать назначения значения "resp"?

1 Ответ

2 голосов
/ 14 февраля 2020

Как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Обещание используется sendRequest(). И значение ответа извлекается в функции asyn c. В следующем модифицированном скрипте сначала запускается sample(). И sendRequest() выполняется, затем значение ответа получается на console.log(res).

Модифицированный скрипт:

function sendRequest() {
  return new Promise((resolve, reject) => {
    var reqbody;
    var resp;

    reqbody = unimportantRandomFunction();

    request.post(
      {
        headers: {
          "content-type": "application/xml",
          accept: "application/xml"
        },
        url: process.env.APIURL,
        body: reqbody
      },
      function(error, response, body) {
        if (error) reject(error);
        resp = convert.xml2js(body, { compact: true });
        resolve(resp);
      }
    );
  });
}

async function sample() {
  const res = await sendRequest().catch(err => console.log(err));
  console.log(res);
}

sample();  // This function is run.

Ссылки:

Если я неправильно понял ваш вопрос и это не то направление, которое вы хотите, я приношу свои извинения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...