Синхронные HTTP-запросы в Node.js - PullRequest
0 голосов
/ 21 мая 2018

У меня есть три компонента A, B и C.Когда A отправляет HTTP-запрос на B, B отправляет другой HTTP-запрос на C, получает относительное содержимое и отправляет его обратно на A в качестве ответа HTTP.

Компонент B представлен следующим фрагментом Node.js.

var requestify = require('requestify');

// sends an HTTP request to C and retrieves the response content
function remoterequest(url, data) {
  var returnedvalue;
  requestify.post(url, data).then(function(response) {
    var body = response.getBody();
    // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
  });
  return returnedvalue;
}

// manages A's request
function manageanotherhttprequest() {
  // [...]
  var res = remoterequest(url, data);
  // possible elaboration of res
  return res;
}

Мне нужно вернуть содержимое body в результате выполнения функции remoterequest.Я замечаю, что в настоящее время запрос POST является асинхронным.Следовательно, переменная returnedvalue никогда не назначается до ее возвращения вызывающему методу.

Как выполнить синхронные HTTP-запросы?

1 Ответ

0 голосов
/ 21 мая 2018

Вы используете restify, который вернет promise после вызова его методов (post, get .. и т. Д.).Но созданный вами метод remoterequest не возвращает promise, чтобы вы подождали, используя .then.Вы можете вернуть promise, используя async-await или встроенный promise, как показано ниже:

  • , используя обещание:

    var requestify = require('requestify');
    
    // sends an HTTP request to C and retrieves the response content
    function remoterequest(url, data) {
      var returnedvalue;
      return new Promise((resolve) => {
        requestify.post(url, data).then(function (response) {
          var body = response.getBody();
          // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
        });
        // return at the end of processing
        resolve(returnedvalue);
      }).catch(err => {
        console.log(err);
      });
    }
    
    // manages A's request
    function manageanotherhttprequest() {
      remoterequest(url, data).then(res => {
        return res;
      });
    }
    
  • с использованием async-await

    var requestify = require('requestify');
    
    // sends an HTTP request to C and retrieves the response content
    async function remoterequest(url, data) {
    
      try {
        var returnedvalue;
        var response = await requestify.post(url, data);
        var body = response.getBody();
        // TODO use body to send back to the client the number of expected outputs, by setting the returnedvalue variable
        // return at the end of processing
        return returnedvalue;
      } catch (err) {
        console.log(err);
      };
    }
    
    // manages A's request
    async function manageanotherhttprequest() {
        var res = await remoterequest(url, data);
        return res;
    }
    
...