简体   繁体   English

AngularJS服务和并发访问全局变量

[英]AngularJS Services and concurrent access to global variable

I use two asynchronous web services. 我使用两个异步Web服务。 I have to make time for adding each object returned in responses. 我必须花时间添加响应中返回的每个对象。 The target data is same ($scope.time is a global variable). 目标数据是相同的($ scope.time是全局变量)。 I fear that when time = time + X some time or crushed. 我担心当time = time + X某个时间或被击碎。

$scope.time = 0;

$scope.elemAs = [];
$scope.loadElemA = function(nb) {
    ElemAService.query({nb: nb}, function(result) {
        $scope.elemAs = result;
        for (var index = 0; index < $scope.elemAs.length; index++) {
            $scope.time = $scope.time + $scope.elemAs[index].time;
        }
    });
};
$scope.loadElemA(2);

$scope.elemBs = [];
$scope.loadElemB = function(nb) {
    ElemBService.query({nb: nb}, function(result) {
        $scope.elemBs = result;
        for (var index = 0; index < $scope.elemBs.length; index++) {
            $scope.time = $scope.time + $scope.elemBs[index].time;
        }
    });
};
$scope.loadElemB(3);

console.log($scope.time);

In my results , I am not sure to get $scope.time = A0.time + A1.time + B0.time + B1.time + B2.time ? 在我的结果中, 我不确定获得$ scope.time = A0.time + A1.time + B0.time + B1.time + B2.time 吗?

In java I use a synchronized methode to do a add by any threads, but in javascript I do not know how to do. 在Java中,我使用同步方法通过任何线程进行加法,但是在javascript中,我不知道该怎么做。

Example 1: 范例1:

(2) = > $scope.time = $scope.time + $scope.elemAs[0].time; (2)=> $ scope.time = $ scope.time + $ scope.elemAs [0] .time; (2) (2)

(4) = > $scope.time = $scope.time + $scope.elemAs[1].time; (4)=> $ scope.time = $ scope.time + $ scope.elemAs [1] .time; (2) (2)

(6) = > $scope.time = $scope.time + $scope.elemBs[0].time; (6)=> $ scope.time = $ scope.time + $ scope.elemBs [0] .time; (2) (2)

(8) = > $scope.time = $scope.time + $scope.elemBs[1].time; (8)=> $ scope.time = $ scope.time + $ scope.elemBs [1] .time; (2) (2)

( 10 ) = > $scope.time = $scope.time + $scope.elemBs[2].time; 10 )=> $ scope.time = $ scope.time + $ scope.elemBs [2] .time; (2) (2)

Example 2: 范例2:

(2) = > $scope.time = $scope.time + $scope.elemAs[0].time; (2)=> $ scope.time = $ scope.time + $ scope.elemAs [0] .time; (2) (2)

(4) = > $scope.time = $scope.time + $scope.elemBs[0].time; (4)=> $ scope.time = $ scope.time + $ scope.elemBs [0] .time; (2) (2)

(6) = > $scope.time = $scope.time + $scope.elemBs[1].time; (6)=> $ scope.time = $ scope.time + $ scope.elemBs [1] .time; (2) (2)

(8) = > $scope.time = $scope.time + $scope.elemAs[1].time; (8)=> $ scope.time = $ scope.time + $ scope.elemAs [1] .time; (2) (2)

( 10 ) = > $scope.time = $scope.time + $scope.elemBs[2].time; 10 )=> $ scope.time = $ scope.time + $ scope.elemBs [2] .time; (2) (2)

Example 3: 范例3:

(2) = > $scope.time = $scope.time + $scope.elemAs[0].time; (2)=> $ scope.time = $ scope.time + $ scope.elemAs [0] .time; (2) (2)

(4) = > $scope.time = $scope.time + $scope.elemBs[0].time; (4)=> $ scope.time = $ scope.time + $ scope.elemBs [0] .time; (2) (2)

(6) = > $scope.time = $scope.time + $scope.elemBs[1].time; (6)=> $ scope.time = $ scope.time + $ scope.elemBs [1] .time; (2) same time $scope.time = $scope.time + $scope.elemAs[1].time; (2) 同时 $ scope.time = $ scope.time + $ scope.elemAs [1] .time; (2) (2)

( 8 ) = > $scope.time = $scope.time + $scope.elemBs[2].time; 8 )=> $ scope.time = $ scope.time + $ scope.elemBs [2] .time; (2) (2)

I have the answer at my question. 我有我的问题的答案。 I had a big loop in each callback. 我在每个回调中都有一个很大的循环。 The javascript have only one thread for all callbacks. javascript对于所有回调只有一个线程。

$scope.time = 0;

$scope.elemAs = [];
$scope.loadElemA = function(nb) {
    ElemAService.query({nb: nb}, function(result) {
        $scope.elemAs = result;
        for (var index = 0; index < $scope.elemAs.length; index++) {
            $scope.time = $scope.time + $scope.elemAs[index].time;
            for(var kk = 0; kk < 10000; kk++){
                console.log("A");
            }
        }
    });
};
$scope.loadElemA(2);

$scope.elemBs = [];
$scope.loadElemB = function(nb) {
    ElemBService.query({nb: nb}, function(result) {
        $scope.elemBs = result;
        for (var index = 0; index < $scope.elemBs.length; index++) {
            $scope.time = $scope.time + $scope.elemBs[index].time;
            for(var kk = 0; kk < 10000; kk++){
                console.log("B");
            }
        }
    });
};
$scope.loadElemB(3);

console.log($scope.time);

with this test, I see that I have 10.000 A and 10.000 B or 10.000 B and 10.000 A. I have never a mix of A and B ( AAABAABBA ... ) 通过此测试,我发现我有10.000 A和10.000 B或10.000 B和10.000A。我从不混合使用A和B(AAABAABBA ...)

My code is good, I have no problem doing my additions in my callbacks 我的代码很好,我在回调中进行添加没有问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM