Angularjs - 看一个承诺 - 未定义

时间:2013-04-17 18:07:46

标签: angularjs promise

我知道模板可以绑定到promise或real值,当该值更改时,模板会更新。

我想在一个指令中执行类似的操作,在那里我会查看对promise的更改,并在更新该promise时重新加载指令中的数据。

但是,当我看到一个承诺时,它似乎注册了更改,但随后立即设置为'undefined'。

请参阅http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=preview

正如您所看到的,模板更新没有问题,但是如果您检查控制台,'isNotAPromise'监视按预期工作,但'isAPromise'监视会被触发两次,都是'undefined'。

任何线索?

以下是让SO满意的代码:

app.controller('MainCtrl', function($scope, $q) {
  var c;
  c = 1;
  setInterval(function() {
    c = c + 1;
    console.log('---------------');
    console.log(['c changed to ', c]);
    return $scope.$apply(function() {
      $scope.isNotAPromise = c;
      return $scope.isAPromise = $q.when(c);
    });
  }, 1000);
  $scope.$watch('isAPromise', function(newVal, oldVal) {
    return console.log(['isAPromise changed', oldVal, newVal]);
  });
  return $scope.$watch('isNotAPromise', function(newVal, oldVal) {
    return console.log(['isNotAPromise changed', oldVal, newVal]);
  });
});

谢谢, 罗伊

1 个答案:

答案 0 :(得分:2)

我添加了一个时间戳来确定两个手表何时触发:

console.log [+new Date(), 'isAPromise changed', oldVal, newVal]

示例输出:

["c changed to ", 3] app.js:12
[1366223960472, "isAPromise changed", 2, undefined] app.js:19
["isNotAPromise changed", 2, 3] app.js:22
[1366223960473, "isAPromise changed", undefined, 3] 

因此,isAPromise上的两只手表相隔1毫秒。我猜测会发生的事情是,$q.when(c)首次分配给$scope.isAPromise时,它是undefined,因为承诺尚未解决。然后解决了承诺(可能在下一个$ digest循环期间),然后将isAPromise设置为(已解决的?)承诺的值。