2015-10-09 2 views
0

У меня довольно трудное понимание того, как связывать обещания. Я записываю функцию входа для своего приложения, используя Angular SDK Loopback. Целью проверки учетных данных пользователя является подтверждение того, что учетная запись пользователя активна, затем выберите некоторые дополнительные свойства, включая роль пользователя, и установите флаг в true, если у пользователя есть права администратора.Javascript promation chaining

Вот мой код ...

$scope.login = function (user) { 
    User.login(user).$promise.then(
     function (data) { 
      $rootScope.activeUser = data; 
      $rootScope.user_id = $rootScope.activeUser.user.username; 
      console.log('Active User: ', $rootScope.activeUser.user.email); 
      console.log('Status: ', $rootScope.activeUser.user.status); 
      if ($rootScope.activeUser.user.status === 'Y') { 
       $scope.loginError = false; 

       function checkAdmin(eid) { 
        Se_user.findById({ 
         id: eid 
        }).$promise.then(
         function (data1) { 
          var user_properties = data1; 
          if (user_properties.role === 'Admin') { 
           $rootScope.isAdmin = true; 
           console.log('isAdminInside: ', $rootScope.isAdmin); 
           return true; 
          } else { 
           //$rootScope.isAdmin = false; 
           return false; 
          } 
         }); 
       }; 

       var isAdmin = checkAdmin($rootScope.user_id); 
       console.log('isAdminOutside: ', $rootScope.isAdmin); 
       $state.go('home'); 

      } else { 
       $scope.loginError = true; 
       $scope.loginErrorMessage = "Your account has been disabled. Please contact BMT Support for assistance"; 
      } 
     }, 
     function (err) { 
      console.log('Error: ', err) 
      $scope.loginError = true; 
      $scope.loginErrorMessage = "You've entered an invalid User ID or Password. Please try again."; 
     }); 
}; 

Я устранения неполадок путем записи в консоли, вот пример вывода ...

Active User: [email protected] 
Status: Y 
isAdminOutside: undefined 
isAdminInside: true 

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

+1

Promise асинхронный! попросите написать 'isAdminOutside' до того, как ваше обещание будет разрешено, поэтому в данный момент оно не определено – Anonymous0day

+0

Что мне нужно сделать, чтобы значение isAdminOutside было установлено после того, как обещание будет разрешено? Это та часть, которую я не могу понять. – sailfish

ответ

0

Попробуйте изменить эту часть кода:

function checkAdmin(eid) { 
    return Se_user.findById({ 
    id: eid 
    }).$promise.then(
    function(data1) { 
     var user_properties = data1; 
     if (user_properties.role === 'Admin') { 
     $rootScope.isAdmin = true; 
     console.log('isAdminInside: ', $rootScope.isAdmin); 
     return true; 
     } else { 
     //$rootScope.isAdmin = false; 
     return false; 
     } 
    }); 
}; 

var isAdmin = checkAdmin($rootScope.user_id) 
    .then(function(val) { 
    console.log('isAdminOutside: ', val); 
    $state.go('home'); 
    }); 
+0

Это сработало, спасибо! – sailfish