gpt4 book ai didi

angularjs - 如何获取 angular $interval 的状态 - 检查间隔是否已取消

转载 作者:行者123 更新时间:2023-12-04 16:27:20 24 4
gpt4 key购买 nike

我是 Angular(和 JS)的新手,只是有点困惑。

我开始一个计时器:

var getOverviewMapTimer = $interval($scope.UpdateOverviewMap, UPDATE_FREQUENCY); 

并且,如果我理解的话, getOverviewMapTimer是一个“ promise ”。

我希望能够检查计时器是否正在运行,并且如果我曾经 $interval.cancel(getOverviewMapTimer);然后 getOverviewMapTimer将是 null我可以检查一下。

情况似乎并非如此。

我是否必须明确销毁 promise (什么是对已取消的计时器的 promise ?)。?如果是这样,我将如何将其显式设置为 null ?

我认为我应该使用 cancel(getOverviewMapTimer); ,但我不是 100% 确定 getOverviewMapTimer之后仍然是非空的。

谢谢你的帮助

最佳答案

var getOverviewMapTimer = $interval(...); getOverviewMapTimer持有对一个对象的引用(恰好是一个 promise )。

$interval.cancel(getOverviewMapTimer)传递(并取消)getOverviewMapTimer 引用的对象变量,但无法将对象转换为 null。 getOverviewMapTimer变量将继续持有对 promise 对象的引用,将其设置为 null 的唯一方法是通过新的赋值(即明确地将其设置为 null):

var getOverviewMapTimer = $interval(...);
...
$interval.cancel(getOverviewMapTimer);
getOverviewMapTimer = null;

进阶话题:

有一种简单的方法来确定间隔 promise 是否已被取消,这听起来确实很好(例如,向 promise 对象添加自定义 cancelled 属性,并在取消间隔时将其值设置为 true)。
Angular 足够酷,具有令人难以置信的灵活性和可扩展性,因此使用 的概念Service Decorator 我们能够“增强” $interval服务,扩展其 cancel()添加 cancelled 的方法属性并将其值设置为 true取消间隔 promise 时:
/* Service Decorators can be configured in `config` blocks */
app.config(function ($provide) {

/* Register a decorator for the `$interval` service */
$provide.decorator('$interval', function ($delegate) {

/* Keep a reference to the original `cancel()` method */
var originalCancel = $delegate.cancel;

/* Define a new `cancel()` method */
$delegate.cancel = function (intervalPromise) {

/* First, call the original `cancel()` method */
var retValue = originalCancel(intervalPromise);

/* If the promise has been successfully cancelled,
* add a `cancelled` property (with value `true`) */
if (retValue && intervalPromise) {
intervalPromise.cancelled = true;
}

/* Return the value returned by the original method */
return retValue;
};

/* Return the original (but "augmented") service */
return $delegate;
});
});

现在,我们可以使用 $interval照常服务,我们可以随时检查间隔 promise 的 cancelled属性(property)以查明它是否已被取消。
var getOverviewMapTimer = $interval(...);
...
console.log(!!getOverviewMapTimer.cancelled); // false
$interval.cancel(getOverviewMapTimer);
console.log(!!getOverviewMapTimer.cancelled); // true

另见此 short demo .

关于angularjs - 如何获取 angular $interval 的状态 - 检查间隔是否已取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23147757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com