Цепочка промисов в Javascript и Angular

Я использую ресурс Angular для получения данных из API следующим образом:

var getAccountListPerUser = function () {

  return $resource(uri, {}, {
    get: {
      headers: service.getDefaultHeaderRequest(),
      method: 'GET',
      transformResponse: function (data) {
        var accountList = [];
        try {
          accountList = JSON.parse(data);
        } catch (e) {
          accountList = [];
        }
        return accountList;
      },
      isArray: true,
      cache: true
    }
  }).get().$promise;
};

В моем контроллере я должен использовать ее и еще две сервисные функции, определенные таким же образом.

var promiseResourcesAccountList = usrWebUserService.getAccountListPerUser();

promiseResourcesAccountList.then(function(result){
  $scope.usersWithAccountsAndProfiles = result;
  var filteredProfiles = [];
  for (var account in result) {
    ...
  }
  $scope.filteredProfiles = filteredProfiles;
});

А также:

var promiseResourcesEditUser = usrWebUserService.getResourcesUser(currentUser);

promiseResourcesEditUser.then(function (result) {
  usrWebUserFactory.mapBasicPreferences($scope, result);
});

И еще очень похоже, эта информация загружает данные в три div, но я хочу показать их только тогда, когда все три функции выполнились правильно. Я думаю, что я должен связать результат обещаний. Как я могу это сделать?


person AndreFontaine    schedule 12.08.2016    source источник
comment
Использование Promise.all([array of your promises]). Здесь документация.   -  person Mario Santini    schedule 12.08.2016


Ответы (2)


Вы можете связать их, как:

promiseResourcesAccountList.then(function(result){
  ///whatever processing
  //return a promise
  return promiseResourcesEditUser()
}).then(function(){
  return anotherPromise();
}).then(function(){
   //update scope here
});

в качестве альтернативы вы также можете использовать $q.all([promise1, promise2, promise3]).then(...);

person terpinmd    schedule 12.08.2016

@terpinmd верен. Цепочка обещаний довольно проста. Допустим, у вас есть служба с «getWidgets», которая возвращает обещание, и вы хотите использовать ответ этой службы для вызова другой службы, «getWidgetOwners», которая вернет другое обещание:

Предположения

  1. getWidgets возвращает массив объектов виджетов.
  2. getWidgetOwners принимает массив идентификаторов владельцев

Как:


    service.getWidgets()
        .then(function(widgets) {
            return widgets.map(function(widget) { // extract ownerIds 
                return widget.ownerId;
            });
        })
        .then(service.getWidgetOwners)            // pass array of ownerId's to       
        .then(function(owners) {                  // the next service
            console.log(owners);           
        });

person Dayne Mentier    schedule 12.08.2016