Javascript 如何使用$q从AngularJS服务返回已解决的承诺?
我的服务是:Javascript 如何使用$q从AngularJS服务返回已解决的承诺?,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我的服务是: myApp.service('userService', [ '$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) { var deferred; deferred = $q.defer(); this.initialized = deferred.promise; this.user = { access: false
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var deferred;
deferred = $q.defer();
this.initialized = deferred.promise;
this.user = {
access: false
};
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: 'email@address.com',
access: 'institution'
};
return deferred.resolve();
};
}
]);
我通过以下方式在我的config
文件中调用此函数:
myApp.run([
'$rootScope', 'userService', function($rootScope, userService) {
return userService.isAuthenticated().then(function(response) {
if (response.data.user) {
return $rootScope.$broadcast('login', response.data);
} else {
return userService.logout();
}
});
}
]);
但是,它抱怨
然后不是一个函数。我不是在退回已决定的承诺吗?退回你的承诺,延期退回。承诺。
promise API具有“then”方法
调用resolve不会返回承诺,它只会向
承诺该承诺已解决,因此它可以执行“then”逻辑
基本模式如下,冲洗并重复
测试
var-app=angular.module(“app”,[]);
应用控制器(“测试”,功能($scope,$q){
$scope.$test=函数(){
var deferred=$q.deferred();
延期。决议(“Hi”);
回报。承诺;
};
$scope.test=函数(){
$scope.$test()
.then(功能(数据){
控制台日志(数据);
});
}
});
引导(文档,[“应用程序]);
从您的服务方法:
function serviceMethod() {
return $timeout(function() {
return {
property: 'value'
};
}, 1000);
}
在控制器中:
serviceName
.serviceMethod()
.then(function(data){
//handle the success condition here
var x = data.property
});
试试这个:
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var deferred= $q.defer();
this.user = {
access: false
};
try
{
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: 'email@address.com',
access: 'institution'
};
deferred.resolve();
};
}
catch
{
deferred.reject();
}
return deferred.promise;
]);
以下是您服务的正确代码:
myApp.service('userService', [
'$http', '$q', '$rootScope', '$location', function($http, $q, $rootScope, $location) {
var user = {
access: false
};
var me = this;
this.initialized = false;
this.isAuthenticated = function() {
var deferred = $q.defer();
user = {
first_name: 'First',
last_name: 'Last',
email: 'email@address.com',
access: 'institution'
};
deferred.resolve(user);
me.initialized = true;
return deferred.promise;
};
}
]);
然后,控制器应相应对齐:
myApp.run([
'$rootScope', 'userService', function($rootScope, userService) {
return userService.isAuthenticated().then(function(user) {
if (user) {
// You have access to the object you passed in the service, not to the response.
// You should either put response.data on the user or use a different property.
return $rootScope.$broadcast('login', user.email);
} else {
return userService.logout();
}
});
}
]);
关于该服务,需要注意的几点:
- 仅在服务中公开需要公开的内容。用户应该在内部保存,并且只能由getter访问
- 在函数中,使用“me”,这是一种使用javascript避免这种边缘情况的服务
- 我猜到了初始化意味着什么,如果我猜错了,请随时纠正我
对于较短的JavaScript代码,请使用以下命令:
myApp.service('userService', [
'$q', function($q) {
this.initialized = $q.when();
this.user = {
access: false
};
this.isAuthenticated = function() {
this.user = {
first_name: 'First',
last_name: 'Last',
email: 'email@address.com',
access: 'institution'
};
return this.initialized;
};
}
]);
您知道您通过使用新对象覆盖它而不是仅设置对象属性来释放对userService.user的绑定吗
以下是我的plnkr.co示例代码示例(工作示例:
):
要返回已解决的承诺,您可以使用:
return $q.defer().resolve();
如果需要解析某些内容或返回数据:
return $q.defer().resolve(function(){
var data;
return data;
});
如何在AngularJS中简单地返回预先解决的承诺
承诺:
return $q.when( someValue ); // angularjs 1.2+
return $q.resolve( someValue ); // angularjs 1.4+, alias to `when` to match ES6
return $q.reject( someValue );
拒绝承诺:
return $q.when( someValue ); // angularjs 1.2+
return $q.resolve( someValue ); // angularjs 1.4+, alias to `when` to match ES6
return $q.reject( someValue );
那么,承诺将如何解决?。然后
将永远不会triggered@Shamoon延迟。解决();在调用它的那一刻解决,因为中没有给定值。我建议不要延迟写信。解决(“Hi”);只需延迟写入即可;得到一个明确的空洞承诺。但是您也可以使用$q.when();要得到一个可解决的空承诺;-)。我认为这比公认的答案要好,因为使用$timeout生成将要解决的承诺无法显示手动创建和解决承诺的机制。@BenjaminGruenbaum是的,你是对的,我不知道,$timeout
实际上返回承诺,serviceMethod可以缩短为:return$timeout(function(){return{property:'value'};},1000);这可能行得通,但肯定不是推荐的返回方法promises@BenjaminGruenbaum我做了,现在返回$timeout生成的承诺。很好,我收回了我的-1。啊,好吧,但我仍然同意他的观点,即使是出于不同的原因!我理解否决票是令人沮丧的,我们可以使用否决票来帮助好的内容上升到顶部,但在这种情况下,我确实觉得你的答案没有帮助,因为它无法解释$q的机制,而是呈现了$q的抽象。对承诺不熟悉的人,或者像我这样熟悉承诺但又不熟悉棱角的人,可能会完全误入歧途!有人能告诉我为什么这是标记为否决票吗?我有一个更简短的版本。这正是我要找的。一种在清除http服务调用时返回静态值的简单方法。