2016-01-19 31 views
0

鋤返回一個承諾我可以在一個工廠返回一個承諾在我的控制器使用給出下面的例子:在工廠

廠:

angular 
    .module('security.authorisation') 
    .factory('AuthService', [ 
     '$http', 
     AuthService 
    ]); 


    function AuthService($http, Endpoints, toastr) { 
    var authService = {}; 
    // Login function. 
    authService.login = function (user, success, error) { 
     var login_url = Endpoints.getUrl("login"); 
     $http.post(login_url) 

     .success(function (data) { 

     }).then(function (temp) { 
     console.log("suc"); 
     }, function (err) { 
     console.log("err"); 
     }); 

    }; 



    return authService; 
    } 

登錄控制器:

(function() { 
    'use strict'; 

    angular 
    .module('login') 
    .controller('LoginController', [ 
     '$scope', 
     'AuthService', 
     LoginController 
    ]); 

    function LoginController($scope, AuthService) { 


    $scope.submit = function submit() { 

     $scope.app = AuthService.initModel; 
     AuthService.login($scope.app) 

     .then(function (greeting) { 
      alert('Success: ' + greeting); 
     }, function (reason) { 
      alert('Failed: ' + reason); 
     }); 


    } 

    } 
})(); 

我得到錯誤:

TypeError: Cannot read property 'then' of undefined

回答

4

看來,你打電話給你的服務的時候忘了 1.注入$ Q回自己的諾言

authService.login = function (user, success, error) { 
     var login_url = Endpoints.getUrl("login"); 
     return $http.post(login_url) 

     .success(function (data) { 

     }).then(function (temp) { 
     console.log("suc"); 
     }, function (err) { 
     console.log("err"); 
     }); 
     //toaster.pop('success', "title", "text"); 
    }; 
1

讀約$ Q ...爲您服務 2.創建遞延對象 3.使用。於是

function returningPromise(){ 
var deferred = $q.defer(); 

callToWhateverYouWantWithReturningPromise().then(function(data){ 
deferred.resolve(data); 
}, function(error){ 
deferred.reject(error); 
}); 
return deferred.promise 
1

您需要使用延遲對象。首先將$q注入您的登錄工廠。

之後,改變你的登錄功能:

提示:據我所知,.success()應該被棄用,因此只使用.then()成功和錯誤回調。

authService.login = function(user, success, error) { 
    var login_url = Endpoints.getUrl("login"); 
    var deferred = $q.defer(); 
    $http.post(login_url) 
    .then(function(temp) { 
     console.log("suc"); 
     deferred.resolve(temp); 
    }, function(err) { 
     console.log("err"); 
    }); 
    //toaster.pop('success', "title", "text"); 
    return deferred; 
}; 

在你的控制器,你應該使用下列內容:

AuthorisationService.login($scope.app).then(function(success) { 
    // do your stuff here as you please 
} 

這應該解決您的問題,您應該處理的承諾的正確方法。

+1

雖然這個工作,它實際上是沒有必要的。 '$ http'返回一個承諾,這意味着在延期內包裹'$ http'會增加不必要的複雜性。 – Claies

+0

那就對了!如果你正在發起一個異步請求,這將是必要的。 – Aer0