我目前正在调用一种服务方法来返回我的Angular应用中的玩家个人资料。然后我需要立即按摩'一些返回的数据利用另一个服务方法调用的结果。我想知道下面是否正确构建了我的控制器,或者我是否应该在我的codesService
来电的$promise
分辨率内进行playersService
来电。
注意:下面的控制器是我实际控制器的简化版本。实际控制器涉及按摩'十几个要素。
'use strict';
angular.module('gameApp')
.controller('ProfileController', ProfileController);
ProfileController.$inject = ['$routeParams', 'playersService', 'codesService'];
function ProfileController($routeParams, playersService, codesService) {
var vm = this;
var playerId = $routeParams.playerId;
var codes;
var getCodes = function() {
codesService.get().$promise.then(function(data) {
codes = data;
});
};
var getProfiles = function() {
playersService.getProfiles({
playerId: playerId
}).$promise.then(function(profiles) {
for (var i = 0; i < profiles.length; i++) {
profiles[i].name = codes.MSP[profiles[i].MSPkey].name;
}
vm.profiles = profiles;
});
};
var init = function() {
getCodes();
getProfiles();
};
init();
}
答案 0 :(得分:1)
您的控制器应该非常简单,并且可以直接准确地获取所需的控制器。
.controller("ProfileController", function(profileService, $routeParams){
var vm = this;
var playerId = $routeParams.playerId;
profileService.getProfiles(playerId)
.then(function(profiles){
vm.profiles = profiles;
});
});
profileService
应该只返回整齐捆绑和打包的所有内容。
需要使用其他服务(即codesService
,playersService
)作为依赖项。而且,正如我在评论中提到的(以及他们的答案中的其他几个),您可以并行调用codesService
和playersService
,但必须等待两者都完成了。
.factory("profileService", function($q, codeService, playersService){
var svc = {
getProfiles: function(playerId){
$q.all({
players: getPlayers(playerId),
codes: getCodes()
})
.then(function(data){
var players = data.players;
var codes = data.codes;
return DoMassaging(players, codes);
})
}
};
return svc;
});
确保getPlayers()
和getCodes()
返回各自的承诺。
答案 1 :(得分:0)
如果then
方法返回一个promise,那么Angular将使用第二个promise的结果进行后续then()
}次调用。
但你真正拥有的就是在你可以进步之前需要两个承诺的情况,而你需要的是$q.all()
(另外,只需从服务方法中返回一个承诺。间接不会改善您的代码。)
$q.all([getCodes(), getProfiles()).then(function(data)) {
var codes = data[0];
var profiles = data[1];
}
如果您不喜欢数组运算,可以通过链接then()调用将其分为两个阶段。
答案 2 :(得分:0)
您所做的事情看起来很危险,因为如果由于任何原因codeService.get()
需要的时间超过playersService.getProfiles({..})
,那么当您尝试将codes
错误时,您将会收到错误codes.MSP[profiles[i].MSPkey].name
访问$q.all(promises)
。
$q.all
$q.all({
codes: codesService.get().$promise,
profiles: playersService.getProfiles({
playerId: playerId
}).$promise
})
.then( function (results) {
var profiles = results.profiles;
var codes = results.codes;
for (var i = 0; i < profiles.length; i++) {
profiles[i].name = codes.MSP[profiles[i].MSPkey].name;
}
vm.profiles = profiles;
});
(docs page)获取promises的数组或哈希并返回自己的promise,只有当所有其他的都是:
{{1}}