为什么这个承诺没有按预期行事?

时间:2015-08-13 14:52:20

标签: javascript angularjs

我很难理解为什么在调用updateStatus()后我看到'promise resolved'登录到控制台,但不是'refreshGames'。如果refreshGames()中的代码永远不会运行,那么承诺如何解决?

var refreshGames = function() {
  console.log('refreshGames');
  var defer = $q.defer();
  playersService.getGames({
    playerId: playerId
  }).$promise.then(function(data) {
    vm.games = data;

    return defer.promise;
  });
};

var updateStatus = function() {
  $q.all([refreshGames.promise]).then(function() {
    console.log('promise resolved');
    populateOptions(vm.games);
    vm.tableParams.reload();
  });
};

2 个答案:

答案 0 :(得分:2)

因为你的函数refreshGames什么都不返回,所以它应该返回promise并且必须解决defer,如下所示:

var refreshGames = function() {
  console.log('refreshGames');
  var defer = $q.defer();
  playersService.getGames({
    playerId: playerId
  }).$promise.then(function(data) {
    vm.games = data;

    defer.resolve(data);
  });

  return defer.promise;
};

并在$q.all中执行refreshGames()

答案 1 :(得分:2)

refreshGames.promiseundefined - 在refreshGames上创建此属性的任何地方都没有代码

$ q.all中的任何非承诺都是有效的,并且实际上等同于Promise.resolve(n)(或者你用$ q执行此操作

所以,你的$ q.all基本上是

$q.all([undefined]).then(function() {
   ...
});

因此立即执行