当前位置: 代码迷 >> JavaScript >> 在Angular服务调用中确定范围
  详细解决方案

在Angular服务调用中确定范围

热度:23   发布时间:2023-06-05 10:34:41.0

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

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

欢迎来到异步调用的世界。

如果你在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
}

记住 - 获得承诺是同步的。 获得承诺的价值......好吧,承诺让你 - 这是异步的。

问题是你在promise解决之前返回defs ,而defs === None

你可以通过改变你的代码来解决这个问题:

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