在工厂里回报承诺
Returning a promise in a factory
我可以 return 工厂承诺在我的控制器中使用下面的示例:
工厂:
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
看来你忘记了return你的承诺
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");
};
了解 $q...
1. 将 $q 注入你的服务
2.创建延迟对象
3. 在调用您的服务时使用 .then
function returningPromise(){
var deferred = $q.defer();
callToWhateverYouWantWithReturningPromise().then(function(data){
deferred.resolve(data);
}, function(error){
deferred.reject(error);
});
return deferred.promise
您需要使用延迟对象。首先将 $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
}
这应该可以解决您的问题,您应该以正确的方式处理承诺。
我可以 return 工厂承诺在我的控制器中使用下面的示例:
工厂:
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
看来你忘记了return你的承诺
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");
};
了解 $q... 1. 将 $q 注入你的服务 2.创建延迟对象 3. 在调用您的服务时使用 .then
function returningPromise(){
var deferred = $q.defer();
callToWhateverYouWantWithReturningPromise().then(function(data){
deferred.resolve(data);
}, function(error){
deferred.reject(error);
});
return deferred.promise
您需要使用延迟对象。首先将 $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
}
这应该可以解决您的问题,您应该以正确的方式处理承诺。