我有一个变量this.eligible
,我想将其赋值给返回的promise而不是实际的promise对象。
userService
this.eligible = this.sweepstakesService.checkUser(data);
sweepstakesService
checkUser({profileId}) {
var deferred = this.$q.defer();
var id = profileId.replace(/[{}]/g, "");
this.$q.when(this.getGuid(id)
.then(guid => this.determineEligibility(guid))
.catch(this.handleError))
.then(function(data){
deferred.resolve(data);
});
return deferred.promise;
}
getGuid(profileId){
return this.resourcesService.guid.save({id:profileId}).$promise.then(data => data.guid);
}
determineEligibility(response){
return this.resourcesService.eligibility.save({id:response}).$promise.then(data => data.isEligible);
}
handleError(response){
console.log(response);
}
目前我正在返回Promise{$$state: Object}
而不是实际已解决的值。
答案 0 :(得分:3)
为了访问promise的结果,您需要在promise对象上提供对then
方法的回调,一旦结果可用,就会异步调用它。
this.sweepstakesService.checkUser(data)
.then(function(value){
this.eligible = value;
});
答案 1 :(得分:0)
当您使用承诺时,您正在执行某些异步请求,因此您必须传递一些回调功能才能检索您的数据,等待它。
您可以使用延迟API中的 $ q.defer()承诺管理器。
$ q.defer()获取2种方法:
resolve(value)
:通过向她提供最终价值来解决我们的相关承诺
reject(reason)
:解决了承诺错误。
不要忘记你正在做一些异步工作 ......
此外,一个好的提示可以是将当前上下文保存到变量中,以便绑定您的数据。
<强>控制器强>
(function(){
function Controller($scope, Service) {
//Save the current context of our controller
var self = this;
self.success = '';
self.fail = '';
//Declare our promise
var promise1 = Service.get(2);
var promise2 = Service.get(6);
promise1.then(function(response){
//Retrieve our response and set it to our success variable
//We use self as our Controller context
self.success = response;
}).catch(function(error){
self.success = error;
});
promise2.then(function(response){
self.fail = response;
}).catch(function(error){
//Retrieve our error and set it to our fail variable
self.fail = error;
});
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
<强>服务强>
(function(){
function Service($http, $q) {
function get(n){
//using $q.defer() from deferred API
var defer = $q.defer();
//Simulate latency
setTimeout(function(){
n < 3
? defer.resolve(n)
: defer.reject('Error');
}, 1500);
//Return our promise
return defer.promise;
}
return {
get: get
}
}
angular
.module('app')
.factory('Service', Service);
})();
然后,您可以使用 controllerAs 语法来实例化您的控制器。
<强> HTML 强>
<body ng-app='app' ng-controller='ctrl as self'>
<div>Success : {{self.success}}</div>
<div>Fail : {{self.fail}}</div>
</body>
您可以在此Working Plunker
上查看示例