鉴于此代码,在一个简单的Angular控制器中:
var s = $timeout(function() {
console.log(s);
}, 2000 );
console.log(s);
$timeout(function() {
$timeout.cancel(s);
}, 1000);
因此,我们会在变量s
中创建一个超时,该超时应该在2秒内发生。然后,1秒钟,我们取消超时,所以它永远不会发生。但是,在我们取消之前,我们会将s
记录到控制台。我们希望看到它的状态代码为1,其值未定义。相反,我们看到它的状态为2,其值被取消。"不知何故,系统"知道"提前我们将取消超时并相应地进行调整。
到底是什么!这是怎么回事?我希望对象s
的状态在我们的$timeout.cancel(s);
调用之后就像这个一样。我当然不希望它。这里发生了什么?
答案 0 :(得分:2)
始终使用
序列化对象$cordovaNetwork
或通过其他方式输出对象的快照,而不是其参考。
答案 1 :(得分:0)
所以,它与系统"知道"这一事实无关。提前发生什么事情。
相反,在您展开已登录Chrome控制台的对象之前,Chrome会在更新时继续更新该对象上的所有属性。 然而,一旦切换打开对象,您就冻结了其直接属性的值。但是,你没有冻结任何孙子的财产。
我更新了上面的代码以获得更高的超时。
var s = $timeout(function() {
console.log(s);
}, 20000 );
console.log(s);
$timeout(function() {
$timeout.cancel(s);
}, 10000);
如果我在不到10秒的时间内同时打开Promise
和$$state
,我会看到下面的屏幕截图。如果我在不到10秒的时间内打开Promise
而不是$$state
,我会将其状态设置为2.