在Angular服务调用中确定范围

时间:2015-07-30 14:11:13

标签: javascript angularjs

我很困惑为什么我不能按要求执行此服务调用。 console.log承诺解析中的definitionsService.get是我所期望的(我想要返回的对象)。但是,在我返回console.log之前defsundefined,这当然意味着我的返回值未定义。我错过了什么?

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

2 个答案:

答案 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)

问题是,在承诺解决之前,您将返回defsdefs === None

您可以通过更改代码来解决此问题:

function getDefinitions() {
  return definitionsService.get().$promise.then(function(data) {
    return data;
  });
};