2015-09-07 2 views
0

У меня есть вопрос в отношении асинхронных вызовов данных в AngularJS.Использование данных одного вызова асинхронного API другому

Проблема в том, что я получаю несколько объектов в массиве из одного вызова API, и мне придется расширять эти объекты данными из другого вызова API.

Я думал о наличии вложенных асинхронных вызовов, но моя логика немного отстает от того, как это будет работать с сервисом $ q. У меня есть служба, которая вернет объект, который был расширен вторым вызовом, поэтому я могу использовать его в контроллере для отображения в представлении.

Первый вызов API возвращает некоторые параметры, которые мне нужны для второго вызова API, чтобы получить соответствующие данные, для которых я вернусь обратно к контроллеру.

Мне нужно зациклиться на первом вызове, чтобы затем запустить второй вызов API внутри этого, но как я верну его обратно на контроллер? Я не могу решить, когда был запущен первый цикл, потому что он сам объясняет.

Каково решение для чего-то подобного?

Редактировать мой вопрос в псевдо-JavaScript:

returnListOfStuff().then(function (data) { 
    var result = data.Result; 

    for (var i = 0; i < result.length; i++) { 
     var dataForListItem = null; 

     returnDataForListItem(result[i].ID).then(function (data) { 
      dataForListItem = data; 
     }); 

     for (prop in dataForListItem[0]) { 
      result[i].prop = dataForListItem[0][prop]; 
     } 
    } 

    return result; 
}); 

Как видно, это не будет работать, учитывая, что только получать результаты от первого звонка returnListOfStuff(), потому что то, что происходит внутри для цикл еще не разрешен. Я не могу понять, как сделать это с $q.all(), потому что у меня нет параметров из returnListOfStuff функции еще

+2

Без кода его трудно судить, что ваша проблема, но это звучит как дубликат [$ Q обещание с петлей] (http://stackoverflow.com/q/25671760/1048572) – Bergi

+0

@Bergi добавлен некоторый псевдокод, чтобы описать проблему ближе ... – NicT

ответ

1

Я не могу понять, как сделать это с $q.all(), потому что не имеет параметры фра ом функция returnListOfStuff еще

Вы можете просто сделать это в then обратного вызова, где у вас есть.

Вы можете вернуть обещание, что $q.all дает ответный звонок, чтобы получить обещание поподробнее result.

returnListOfStuff().then(function (data) { 
    var result = data.Result; 
    return $q.all(result.map(function(resultItem) { 
     return returnDataForListItem(resultItem.ID).then(function (data) { 
      for (prop in data[0]) { 
       resultItem[prop] = data[0][prop]; 
      } 
      return resultItem; 
     }); 
    })); 
}); 
1

Try использование $q.all() для этого:

var loadQ = []; 
var dataForListItem = null; 
for (var i = 0; i < result.length; i++) { 
    loadQ.push(returnDataForListItem(result[i].ID)); 
} 

$q.all(loadQ).then(function(values){ 
    dataForListItem = values;//or values[0], I dnt known Your data structure; 
}); 

Если вы будете иметь проблемы с i значения, попробуйте использовать:

for (var i = 0; i < result.length; i++) { 
    (function(e) { 
     loadQ.push(returnDataForListItem(result[e].ID)); 
    })(i); 
} 
+0

Я постараюсь сделать этот подход и отчитаться. Спасибо, не знал, что смогу это сделать. – NicT

+0

@NicT и, если возможно, добавьте код 'returnDataForListItem' в свой вопрос, для более профессиональной помощи. – user3335966

Смежные вопросы