Javascript 有棱角的承诺(指承诺?)。或者我如何链接一个。然后在一个$http.success

Javascript 有棱角的承诺(指承诺?)。或者我如何链接一个。然后在一个$http.success,javascript,angularjs,promise,Javascript,Angularjs,Promise,我得到了一个服务: App.factory('AuthService', function ($q, $http, CredentialStorage) { var _endpoint = 'http://localhost:3000'; return { login: function (credentials) { return $http .post('/api/users/login', credentials) .succes

我得到了一个服务:

App.factory('AuthService', function ($q, $http, CredentialStorage) {
  var _endpoint = 'http://localhost:3000';
  return {
    login: function (credentials) {
      return $http
        .post('/api/users/login', credentials)
        .success(function (apiResult) {
          var deferred = $q.defer();

          if (apiResult.code == 0) { 
            $scope.user = apiResult.context;
            CredentialStorage.store(apiResult.context);
          }

          return deferred.promise;
        })
        .fail(function(apiResult, status, headers) {
          var deferred = $q.defer();
          return deferred.promise;
        });
    },
....});
在这里,我对用户进行身份验证并将其存储在某个cookie或其他任何东西中(这与此无关)

然后在我的控制器上我得到:

App.controller('LoginController', function ($scope, $rootScope, AuthService) {
    var _login = function($event) {
        $event.preventDefault();

        AuthService.login($scope.l).then(function() {
            alert('aaa');
            if (!AuthService.authenticatedUser) {
                $scope.errors = ['Invalid username and password. Please try again.'];
                alert($scope.errors);
            } else {
                alert('a' + $scope.errors);
            }
        })
    }
    $scope.login = _login;
});
由于某种原因,我的控制器无法执行。为什么呢


谢谢

好吧,简单的答案是:您使用
。然后
它链接而不是
成功
,它只是添加了一个侦听器:

App.factory('AuthService', function ($q, $http, CredentialStorage) {
  var _endpoint = 'http://localhost:3000';
  return {
    login: function (credentials) {
      return $http
        .post('/api/users/login', credentials)
        .then(function (response) {
          var apiResult = response.data;
          if (apiResult.code == 0) { 
              CredentialStorage.store(apiResult.context);
              return apiResult.context; // promises let you return the value
          }
          throw new Error("Authentication failed"); // return $q.reject
                                                    // if you don't want to invoke
                                                    // exceptionHandler
        });
    },
....});
这样你就可以:

   AuthService.login($scope.l).then(function(result) {
        $scope.user = result;
   }).catch(function(err){
        // code to handle the case authorization failed or the API call failed
   });

从关注点的角度来看,在服务/工厂/提供者中修改UI范围通常是不好的。最好返回结果。

哪些是
var deferred=$q.deferred()应该怎么做?你永远无法解决这些问题。而且,我认为你不能从
成功
/
失败
返回
,就像你可以从
然后
回调一样。好吧-显然这就是问题所在。我刚刚发现了承诺,我正在了解它们。
失败
从何而来?它不是angular的promise接口的一部分。
success()
then()
的参数有所不同。所以,与其说是
then(函数(apireult){…
不如说是
then(函数(response){var apireult=response.data;..
你可能还想把
return
语句移到
CredentialStorage.store()
call;)后面,哈哈,我的脑袋一定在别的地方了