【问题标题】:Angularjs - watching a promise - getting undefinedAngularjs - 看着一个承诺 - 变得未定义
【发布时间】:2023-03-17 08:52:01
【问题描述】:

我知道模板可以绑定到承诺或真实值,并且当该值更改时,模板会更新。

我想在指令中做一些类似的事情,我观察一个承诺的变化,并在该承诺更新时重新加载指令中的数据。

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

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

您可以看到模板更新没有问题,但是如果您检查控制台,“isNotAPromise”手表按预期工作,但“isAPromise”手表被触发两次,都是“未定义”。

有什么线索吗?

下面是让你开心的代码:

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]);
  });
});

谢谢, 罗伊

【问题讨论】:

  • 这与AngularJS的生命周期有关。还有其他关于这个的答案。 $watch 在开始时至少被调用两次,因此您可能需要检查 undefined 和 newval == oldval。
  • 感谢 jpmorin,但这个问题更多的是关于承诺和非承诺之间的区别 - 这些场景返回到手表的值是不同的

标签: angularjs promise


【解决方案1】:

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

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,因为promise 还没有解决。然后 promise 被解析(可能在下一个 $digest 循环期间),然后isAPromise 被设置为(resolved?)promise 的值。

【讨论】:

  • 大概就是这个了。我还有一些关于测试的想法 - 在我“插入”它们之后会用这些想法更新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2017-01-19
相关资源
最近更新 更多