AngularJS中存在竞争条件吗?
Do race conditions exist in AngularJS?
我正在编写一个控制器,最终出现了这样一种情况,即用户的操作改变了$scope
上的状态,而$timeout
可能同时运行。在AngularJS中,这是一个需要注意的问题吗?下面是代码的简化:
function Ctrl($scope, $timeout) {
$scope.counter = 0;
$timeout( function incrementor() {
$scope.counter += 1;
$timeout(incrementor, 100);
}, 100 )
// Call when user clicks a button
$scope.onClick = function() {
$scope.counter += 1;
}
}
我知道只有一个线程在运行,但是什么操作是原子的?
正如你所说,Javascript是单线程的,所以在同一时间没有改变同一对象的风险。你的timeout函数和onClick函数永远不会在同一时间执行(尽管看起来是这样)。
在这种情况下,你可以在计时器中添加一个安全保护,就像这样:
function Ctrl($scope, $interval) {
$scope.counter = 0;
var lastIntervalCounter = $scope.counter;
$interval(function incrementor() {
if (lastIntervalCounter == $scope.counter) {
// Only perform this if the counter hasn't been modified
// since the last time incrementor was called
$scope.counter += 1;
}
lastIntervalCounter = $scope.counter;
}, 100);
}
相关文章:
- 如何解决取消抖动的用户输入上的竞争条件
- JavaScript 中的竞争条件
- Chrome扩展 chrome.storage 如何同时进行大量获取和设置并避免竞争条件
- 修复在执行http获取请求angularJS时的竞争条件
- JavaScript img.oner更改源-竞争条件时出错
- 使用jQuery提交表单时的竞争条件
- Firefox启动的扩展,在顶级中导入时的竞争条件
- Javascript-在检查对象属性是否存在时避免异步竞争条件
- 使用独立的 AngularJS 控制器修复竞争条件
- jQuery 事件的竞争条件
- 可能的 JavaScript ajax 调用竞争条件
- JS AJAX 提前键入结果排序/竞争条件
- JavaScript 承诺和竞争条件
- 具有多个“数据”事件处理程序和竞争条件的 NodeJS 流
- 在Javascript中竞争条件可能吗?(例如:我想原子地获取和设置值)
- 如何使用getter和setter方法创建一个Angular工厂而不遇到竞争条件
- 如何使用javascript使异步ajax半同步以避免竞争条件
- Koa.js在竞争条件下产生值
- 用于循环ajax潜在竞争条件的Javascript
- 可能的PHP/Javascript竞争条件