Передача тела HTTP от одной функции к другому узлуJS - PullRequest
0 голосов
/ 01 декабря 2018

Я использую пакет запросов nodeJS и хочу вернуть JSON из одной функции в другую.В настоящее время мое решение таково:

var request = require('request');

function A() {
   var url = "---";
   var headers = { 'data': '---' };
   var resp = request.get({ url: url, headers:headers }, function (e, r, 
   body)
    {
      console.log(body)
    });
  return response;
}
function B() {
   data = A();
   console.log("recived data");
   console.log(data);
}
B();

Я сталкивался с обратными вызовами, но я не совсем понимаю, как их использовать.Я родом из питона.Я в замешательстве. Как я могу вернуть тело из моего FuncA в FuncB.Потому что в этом случае я не получаю тело, которое я хочу.Он дает мне некоторые данные, такие как событие JSON, обратный вызов JSON и многое другое.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Вы можете думать о обратном вызове как о функции, которая вызывается, когда что-то завершено (вообще говоря).В вашем примере обратным вызовом является эта функция:

function (e, r, 
   body)
    {
      console.log(body)
    }

Таким образом, вам необходимо вернуться внутрь этого обратного вызова, потому что именно тогда вы получите ответ на запрос, который вы делаете.В вашем примере вы возвращаете ответ до того, как на самом деле есть ответ для возврата, потому что код продолжит выполняться и выполнит оператор return, даже если вы еще не получили ответ.Кроме того, переменная response не существует.

Приведенное выше решение Амира - это чистый и хороший способ сделать это.Is использует синтаксис async / await, который является довольно новым и основан на Promises.Я бы порекомендовал вам взглянуть на обе эти концепции, но обратные вызовы все еще очень распространены в JS (возможно, наиболее распространенных), поэтому их понимание важно.

Если вы хотите использовать обратные вызовы в вашем примере, попробуйте следующее:

var request = require('request');

function A(callback) {
   var url = "---";
   var headers = { 'data': '---' };
   var resp = request.get({ url: url, headers:headers }, function (e, r, 
   body)
    {
      console.log(body)
      callback(r); // Here, we send the response to the callback function
    });

}
function B() {
   A(function(data) { // this is the callback function sent to A()
       console.log("recived data");
       console.log(data);
   });
}
B();

(сейчас я не могу сам протестировать этот код, поэтому могут быть некоторые опечатки.)

Редактировать: если вы хотите использовать данные, полученные в функции BВы можете передать ему обратный вызов, например, так:

function B(callback) {
    A(function(data) { // this is the callback function sent to A()
        console.log("recived data");
        console.log(data);
        callback(data);
   });
}

Чтобы использовать данные из функции B:

B(function(data) {
  // do something with the data here
});
0 голосов
/ 01 декабря 2018

вы можете использовать async/await и запрос-обещание как показано ниже:

var request = require('request-promise');

async function A() {
   var url = "---";
   var headers = { 'data': '---' };
   var resp = await request.get({ url: url, headers:headers });
  return response;
}

async function B() {
   data = await A();
   console.log("recived data");
   console.log(data);
}

B();
...