我很困惑为什么我不能按要求执行此服务调用。 console.log
承诺解析中的definitionsService.get
是我所期望的(我想要返回的对象)。但是,在我返回console.log
之前defs
是undefined
,这当然意味着我的返回值未定义。我错过了什么?
function getDefinitions() {
var defs;
definitionsService.get().$promise.then(function(data) {
console.log(data);
defs = data;
console.log(defs);
});
console.log(defs);
return defs;
};
我将上述内容改为:
function getDefinitions() {
var defs = $q.defer();
definitionsService.get().$promise.then(function(data) {
defs.resovle(data);
});
return defs.promise;
};
根据以下答案。
我也按照相同的答案更改了我调用此方法的方式:
function detail(account) {
getDefinitions().then(function(definitions) {
var key = angular.isDefined(definitions.ABC[account.code]) ? account.code : '-';
return definitions.ABC[key].detail;
});
}
然后在我的控制器中,我尝试执行以下操作:
var getAccounts = function() {
playersService.getAccounts({
playerId: playerId
}).$promise.then(function(accounts) {
for (var i = 0; i < accounts.length; i++) {
accounts[i].detail = utilitiesService.detail(accounts[i]);
}
vm.accounts = accounts;
});
};
var init = function() {
getAccounts();
};
init();
我的问题是accounts[i].detail
始终是undefined
。
答案 0 :(得分:2)
欢迎来到异步调用的世界。
如果你在getDefinitions(来自definitonsService)中进行异步调用,那么你必须假设getDefinitions()也是异步的。这意味着你不能简单地返回defs。
在返回defs之前打印defs时,尚未执行该服务的异步调用。
defs也应该是一个承诺对象。然后您可以像往常一样返回它,但是调用它的方法也应该使用.then(函数(defs)...
或以代码形式:
function getDefinitions() {
var defs = $q.defer();
definitionsService.get().$promise.then(function(data) {
defs.resovle(data);
});
return defs.promise;
};
无论是谁调用getDefinitions()
:
getDefinitions().then(function(defs) {
// do something with defs...
}
编辑后回答问题:
问题再次出现在getAccounts方法中的异步性质。 utilitiesService.detail是一个异步方法。所以你实际上是在账户[i] .detail。
中分配承诺而不是价值由于每个帐户都需要异步调用,因此使用$ q.all似乎是一个好主意:
var promises = [];
for (var i = 0; i < accounts.length; i++) {
promises.push(utilitiesService.detail(accounts[i]));
}
$q.all(promises).then(function(values)){
// you should have all the account details inside 'values' and can update vm.accounts
}
记住 - 获得承诺是同步的。获得承诺的价值......好吧,承诺让你 - 这是异步的。
答案 1 :(得分:0)
问题是,在承诺解决之前,您将返回defs
,defs === None
。
您可以通过更改代码来解决此问题:
function getDefinitions() {
return definitionsService.get().$promise.then(function(data) {
return data;
});
};