问题描述
我很困惑为什么我不能按要求执行此服务调用。
console.log
在definitionsService.get
承诺解析中是我所期望的(我想要返回的对象)。
然而,在我返回defs
之前的console.log
是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
。
1楼
Tom Teman
2
已采纳
2015-07-30 14:17:49
欢迎来到异步调用的世界。
如果你在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
}
记住 - 获得承诺是同步的。 获得承诺的价值......好吧,承诺让你 - 这是异步的。
2楼
Daniel Cottone
0
2015-07-30 14:18:26
问题是你在promise解决之前返回defs
,而defs === None
。
你可以通过改变你的代码来解决这个问题:
function getDefinitions() {
return definitionsService.get().$promise.then(function(data) {
return data;
});
};