在另一个服务中使用一个服务调用的结果(Angular)

时间:2015-07-27 16:46:16

标签: javascript angularjs

我目前正在调用一种服务方法来返回我的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();
}

3 个答案:

答案 0 :(得分:1)

您的控制器应该非常简单,并且可以直接准确地获取所需的控制器。

.controller("ProfileController", function(profileService, $routeParams){
  var vm = this;
  var playerId = $routeParams.playerId;

  profileService.getProfiles(playerId)
    .then(function(profiles){
       vm.profiles = profiles;
    });
});

profileService应该只返回整齐捆绑和打包的所有内容。

需要使用其他服务(即codesServiceplayersService)作为依赖项。而且,正如我在评论中提到的(以及他们的答案中的其他几个),您可以并行调用codesServiceplayersService,但必须等待两者都完成了。

.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}}