Вернуть цепочку обещаний в AngularJS

У меня есть следующий код:

var service = {
   startSetup: function() {
      //If not logged in, redirect to login page
      console.log('starting setup, checking login status');
      return LoginService.loginStatus().then(function(result) {
        var isGrantedPermissionToRoom = result.data.grantedAccess;

        if (!isGrantedPermissionToRoom) {
          $window.location = $window.location + '/login';
        } else {
          console.log('setting up room');
          return service.setupRoom();
        }
      });
    },
    setupRoom: function() {
      return RoomStateService.getRoomState().then(function() {
        return UserService.getInitialUsersList();
      });
    }
  };

return service;

Я хочу, чтобы startSetup возвращал обещание от UserService.getInitialUsersList после того, как все будет завершено.

Мой код вызова:

SetupService.startSetup().then(function() {
    console.log('Checking connection to room');
    $scope.checkConnectionToRoom(UserService.myUserInfo)
 }

и код для `UserService.getInitialUsersList':

getInitialUsersList: function() {
  console.log('Getting initial users list');
  var deferred = $q.defer();

  service.getUserList().then(function(results) {
    var newUserList = results.data.results;

    updateLocalUserList(newUserList);
    updateMyInformation();
    HandsUpService.processAllUsers(newUserList);
    deferred.resolve();
  });
  return deferred.promise;
}

Я знаю, что пока не обрабатываю отказы, но проблема не в этом. Кажется, что очень редко UserService.getInitialUsersList не запускается полностью/вообще, когда управление возвращается вызывающему коду.

Правильно ли я возвращаю цепочку обещаний вызывающему коду?

Спасибо


person Si-N    schedule 28.05.2017    source источник
comment
Ваш код вызова выглядит нормально. Но вам действительно следует избегать отложенного антипаттерна в getInitialUsersList.   -  person Bergi    schedule 28.05.2017
comment
Спасибо, я думал, что мой придумал. Я не понимаю, что я должен возвращать из getInitialUsersList, не создавая собственного обещания, поскольку мне нужно, чтобы работа после service.getUserList() была завершена до того, как я вернусь. Все внутри этой функции синхронно.   -  person Si-N    schedule 28.05.2017
comment
почему, если (!isGrantedPermissionToRoom) не существует возврата?   -  person mrmr68    schedule 28.05.2017
comment
зачем вызывать deferred.resolve() без аргументов?   -  person mrmr68    schedule 28.05.2017
comment
@ Si-N Вы должны просто return вернуть значение вызова then(…), как вы делали это в других своих методах.   -  person Bergi    schedule 28.05.2017
comment
@Bergi - Спасибо, отлично работает.   -  person Si-N    schedule 28.05.2017
comment
Значит, проблема действительно была вызвана отказами, с которыми вы не справились?   -  person Bergi    schedule 28.05.2017
comment
Нет, я не получаю необработанные ошибки отклонения. Я имел в виду, что избавился от явного обещания, вместо этого вернув then(...). Я не уверен, что проблема все еще существует, поскольку она очень прерывистая, и если кажется, что вызывающий абонент (иногда!) восстанавливает контроль до завершения getInitialUsersList. Хотя это может быть отвлекающим маневром.   -  person Si-N    schedule 28.05.2017