Использование данных, доступных в асинхронной функции по запросу узла, для обновления данных приложения - PullRequest
0 голосов
/ 03 мая 2018

Это упрощение модуля в nodejs, над которым я работаю. Я знаю, что функция, отправленная в качестве второго параметра запроса, является асинхронной. Но я не могу понять, как я могу получить доступ к этим данным. По сути, мне нужно извлечь какой-нибудь внешний файл json, надеюсь, только один раз, когда сервер запустится (и я вызываю функцию requestJson), и использовать эти данные для обновления глобального модуля json_data. Этими json_data будут данные, к которым обращается API (apicall1 и apicall2, соответствующие getSomeJSONData1 и getSomeJSONData2)

var json_data = []; // <-- here I want to put the json data  

var requestJson = function() {
  request({
    url: "example.com/somejson.json",
    json: true
  }, function(error, response, body) {
    if (!error && response.statusCode === 200) {
      //here I have access to the json content
      // how I can do to use the body content 
      // and put it on json_data
    }
  });
}

var getSomeJSONData1 = function() {
  return json_data[0];
};

var getSomeJSONData2 = function() {
  return json_data[1];
};

exports.apicall1 = getSomeJSONData1;
exports.apicall2 = getSomeJSONData2;

как я мог это сделать?

1 Ответ

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

Попробуй это. Установить q модуль.

var json_data = []; // <-- here I want to put the json data  

var requestJson = function() {
  var dfd = q.defer();
  request({
    url: "example.com/somejson.json",
    json: true
  }, function(error, response, body) {
    if (!error && response.statusCode === 200) {
      //assign json_data
      dfd.resolve({});
    } else {
      dfd.reject({});
    }
  });
  return dfd.promise;
}

var getSomeJSONData1 = function() {
  var dfd = q.defer();
  if(json_data.length){
    dfd.resolve(json_data[0]);
  } else {
    requestJson()
      .then(function(res) {
        dfd.resolve(json_data[0]);
      })
      .catch(function(err) {
        dfd.reject('error');
      });
  }
  return dfd.promise;
};

var getSomeJSONData2 = function() {
  var dfd = q.defer();
  if(json_data.length){
    dfd.resolve(json_data[1]);
  } else {
    requestJson()
      .then(function(res) {
        dfd.resolve(json_data[1]);
      })
      .catch(function(err) {
        dfd.reject('error');
      });
  }
  return dfd.promise;
};

exports.apicall1 = getSomeJSONData1;
exports.apicall2 = getSomeJSONData2;
...