Цепочка нескольких обещаний, созданных через цикл for

0

Я изучал обещания по этой ссылке, и я понял ее идею

var parentID;

$http.get('/api/user/name')
  .then(function(response) {

  parentID = response.data['ID'];
  for (var i = 0; i < response.data['event-types'].length; i++) {
    return $http.get('/api/security/' + response.data['event-types'][i]['key']);
  }

  })
  .then(function(response) {

    // response only returns one result of the many promises from the for loop
    // do something with parentID; 

  });

Тем не менее, мой вариант использования требует прокрутки и отправки создания более 1 обещания. Я попытался связать как пример выше, но только одно из обещаний, созданных из цикла for, было выполнено.

Как я могу продолжать связывать все обещания, продолжая иметь доступ к переменному parentID?

Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Вы должны использовать $q.all потому что он интегрирован с циклом дайджеста AngularJS.

var parentID;

$http.get('/api/user/name')
  .then(function(response) {

      parentID = response.data['ID'];
      var promiseList = [];
      for (var i = 0; i < response.data['event-types'].length; i++) {
          var iPromise = $http.get('/api/security/' + response.data['event-types'][i]['key']);
          promiseList.push(iPromise);
      };
      return $q.all(promiseList);

  })
  .then(function(responseList) {

       console.log(responseList);

  });

Из Документов:

все (обещания);

Объединяет несколько обещаний в единое обещание, которое разрешается, когда все вступительные обещания разрешаются.

параметры

Массив или хэш обещаний.

Возвращает

Возвращает одно обещание, которое будет разрешено с помощью массива/хэша значений, каждое значение, соответствующее обещанию с тем же индексом/ключом в массиве обещаний/хеш. Если какое-либо из обещаний будет разрешено с отклонением, это обещание будет отклонено с тем же значением отклонения.

- AngularJS $ q Service API Reference - $ q.all

0

Вы можете использовать Promise.all(), заменить Array.prototype.map() for for loop

  var parentID;

  $http.get('/api/user/name')
  .then(function(response) {    
  parentID = response.data['ID'];
  return Promise.all(response.data['event-types'].map(function(_, i) {
    return $http.get('/api/security/' + response.data['event-types'][i]['key'])
    })) 
  })
  .then(function(response) {

    // response only returns one result of the many promises from the for loop
    // do something with parentID; 

  })
  .catch(function(err) {
    console.log(err);
  });

Ещё вопросы

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