AngularJS - 在while循环中从缓存中发送和删除JSON数据时出现奇怪的错误?

时间:2015-09-02 13:27:06

标签: json angularjs caching store forward

循环行为异常,警报无序触发,并且JSON数据在同一时间全部发送。我不明白为什么会发生这种情况。我一直在努力解决这个问题太久了,任何帮助都会被疯狂地欣赏!

使用3个缓存的JSON对象提交,序列为:

警报“应该是第二” 提醒“应该是第二” 提醒“应该是第二” 提醒“{@xmlns:ns3”:“url}”
警告“应该是第一个”
警告“0posted”

然后成功将所有三个JSON对象同时发送到数据库。 cachePostCount现在设置为零

app.controller('FormCtrl', function($scope, $filter, $window, getData, Post, randomString) {
  // Get all posts
  $scope.posts = Post.query();

  // Our form data for creating a new post with ng-model
  $scope.postData = {};
    $scope.$on('updateImage', function () {
        $scope.postData.attachment = getData.image;
    });
    $scope.postData.userid = "Mango Farmer";
    $scope.postData.uuid = randomString(32); //$scope.genUUID();
    $scope.$on('updateGPS', function () {
        $scope.postData.gps = getData.gps;
    });
    $scope.postData.devicedate = $filter('date')(new Date(),'yyyy-MM-dd HH:mm:ss');

  $scope.newPost = function() {
    var post = new Post($scope.postData);

    var postCount = window.localStorage.getItem("cachedPostCount");

    if(typeof postCount == 'undefined' || postCount == null){
            postCount = 1;
            window.localStorage.setItem("cachedPostCount", postCount);
        }
        else {
            postCount ++;
            window.localStorage.setItem("cachedPostCount", postCount);
        }

    window.localStorage.setItem("post" + postCount, JSON.stringify(post));

    while (postCount > 0) { 

        var curCacheObj = new Post(JSON.parse(window.localStorage.getItem("post" + postCount) || '{}'));

        curCacheObj.$save().then(function(response) {
                var servResponse = JSON.stringify(response);
                alert(servResponse);
                if (servResponse.indexOf("@xmlns:ns3") > -1) {
                    alert("should be first");
                    window.localStorage.removeItem("post" + postCount);
                    alert(window.localStorage.getItem("cachedPostCount") + "posted");
                    $window.location.href = 'success.html';
                }
                else {
                    alert("Unable to post at this time!");
                }
            });

        alert("should be second");
        postCount --;
        window.localStorage.setItem("cachedPostCount", postCount);
    }
};

2 个答案:

答案 0 :(得分:0)

$save()是一个异步操作,保证在事件循环中的下一个滴答之后才会发生,这将在 alert("should be second");发生后发生。您应该将此警报(以及任何其他逻辑)放在另一个then()函数的then()函数或链中依赖于该排序,并将其置于其中,如下所示:

    curCacheObj.$save().then(function(response) {
            var servResponse = JSON.stringify(response);
            alert(servResponse);
            if (servResponse.indexOf("@xmlns:ns3") > -1) {
                alert("should be first");
                window.localStorage.removeItem("post" + postCount);
                alert(window.localStorage.getItem("cachedPostCount") + "posted");
                $window.location.href = 'success.html';
            }
            else {
                alert("Unable to post at this time!");
            }
        }).then(function() {
            alert("should be second");
            postCount --;
            window.localStorage.setItem("cachedPostCount", postCount);
        });

答案 1 :(得分:0)

问题在于。$ save()不喜欢while循环(可能因为它是前面提到的异步函数)。我使用if语句重新创建了while循环的效果,如果缓存的postCount仍然具有如下数据,则会再次触发该函数:

$scope.submitAndClearCache = function() {

        var postCount = window.localStorage.getItem("localPostCount");
        var curCacheObj = new Post(JSON.parse(window.localStorage.getItem("post" + postCount) || '{}'));

        if (postCount != 0) {
            curCacheObj.$save().then(function(response) {
                    alert(response);
                    alert("Post " + postCount + " sent!");
                }).then(function() {
                postCount --;
                window.localStorage.setItem("localPostCount", postCount);
                postCount = window.localStorage.getItem("localPostCount");
                $scope.submitAndClearCache();
            });
        }
    };

    $scope.addCachePost = function() {
        var frmData = new Post($scope.postData);
        var postCount = window.localStorage.getItem("localPostCount");
        postCount ++;

        window.localStorage.setItem("localPostCount", postCount);
        window.localStorage.setItem("post" + postCount, JSON.stringify(frmData));
    };

这项技术有效,看起来很奇怪。