Доступ к внешним данным ответа в виде вложенного вызова $ http

0

Простите, поскольку я новичок в AngularJS.

У меня есть следующий вложенный вызов $ http,

  $http({
    method: 'GET',
    url: host1,
    params: {
      'format': 'json',
    }
  }).then(function successCallback(response) {
    for (var i = 0; i < response.data.length; i++) {

      $http({
        method: 'GET',
        url: response.data[i]['url'] + "packet-trace/base",
        params: {
          'format': 'json',
        }
      }).then(function successCallback(response2) {

        //Retrieve some information from first $http call
        var doSomething =  response.data[i]['information'];
        var doSomething2 = doSomething + response2.data['information'];

      }, function errorCallback(response2) {
        //Error
      });
    }

  }, function errorCallback(response) {
      //Error
  });

Мне нужно получить данные из первого вызова $ http, а затем извлечь данные из $ http и использовать обе эти данные как часть моей логики. Однако я не могу получить доступ к данным из первого вызова $ http. Счетчик циклов 'i' всегда равен длине response.data.

Как я могу получить доступ к первым данным вызова $ http?

Кроме того, существуют ли какие-либо конкретные соглашения о кодировании или определенный API, который я могу использовать для последовательного вызова $ http? Вложенные $ http звонки становятся грязными и трудными в обслуживании.

Благодарю.

Теги:

2 ответа

0

Хорошо, что из-за асинхронного характера javascript. Я предлагаю использовать async для вашего прецедента. Может показаться немного сложным, но как только вы поймете понятия асинхронного программирования, вам будет очень полезно использовать его. Это то, что вы можете сделать:

async.waterfall(
 [
   function(callback){
     $http({
       method: 'GET',
       url: host1,
       params: {
        'format': 'json',
       }
    }).then(function successCallback(response) {
      callback(null, response);
    });
   },
   function(callback, response){
     async.times(response.data.length, function(i,next){
       $http({
        method: 'GET',
        url: response.data[i]['url'] + "packet-trace/base",
        params: {
        'format': 'json',
       }
       }).then(function successCallback(response2) {

       //Retrieve some information from first $http call
       var doSomething =  response.data[i]['information'];
       var doSomething2 = doSomething + response2.data['information'];
       next(null,doSomething, doSomething2);

     }, function errorCallback(err) {
       next(err, null);
       });
     }); 
   }
 ], 
 function(err,doSomethingArr, doSomething2Arr){
    // get your arrays here

});
0

Причина этого в том, что цикл, вероятно, завершил итерацию до того, как вызов AJAX завершился успешно. На этом этапе i, очевидно, будет равен response.data.length.

Вы можете захватить значение вне вызова AJAX, а затем использовать его в обратном вызове success чтобы вы не зависели от переменной i внутри обратного вызова:

for (var i = 0; i < response.data.length; i++) {
    // Capture the value you need here
    var someValue = response.data[i]['information'];

    $http({
        method: 'GET',
        url: response.data[i]['url'] + "packet-trace/base",
        params: {
            'format': 'json',
        }
    }).then(function successCallback(response2) {
        // Use the captured value from the first call here
        var doSomething =  someValue;
        var doSomething2 = doSomething + response2.data['information'];
    }, function errorCallback(response2) {
        //Error
    });
}
  • 0
    Я тоже пытался это сделать. Однако произошло то же самое, он смог получить только последнее значение.
  • 0
    Если вы поставите console.log(someValue); Сразу после захвата значения и перед отправкой запроса AJAX в цикле вы видите правильные значения на каждой итерации?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню