响应字符串JavaScript未定义

时间:2017-08-20 12:32:22

标签: javascript angularjs json

我有一个用angularjs编写的程序。我在网上收到服务器的json数据。我现在正在开发离线模式..

我有问题,但我不知道为什么我无法修复。

当程序脱机获取此json字符串时,我将json信息保存到localStorage。

service.js - 对于webservicecall

webServiceCallPost: function(data, action) {
            console.log("data    "+JSON.stringify(data));
            console.log("action    "+JSON.stringify(action));
            var deferred = $q.defer();
            if (navigator.connection.type != "none") {
                return $.ajax({
                    type: "POST",
                    url: appConst.serviceUrl.service + action,
                    crossDomain: true,
                    dataType: "json",
                    data: data,
                    timeout: 2000000,
                    async: true,
                    success: function(response) {
                        localStorage.setItem(data + action, JSON.stringify(response));

                        deferred.resolve();
                    },


      error: function(xhr, ajaxOptions, thrownError) {
                    $ionicLoading.hide();
                    if (xhr.status == 0) {
                        window.plugins.toast.showShortBottom($translate.instant("timedOutError"));
                    } else if (xhr.status == 404) {
                        window.plugins.toast.showShortBottom($translate.instant("timedOutError"));
                    } else {
                        window.plugins.toast.showShortBottom($translate.instant("timedOutError"));
                    }
                },
                beforeSend: function() {},
                complete: function() {}
            });

        } else {
            window.plugins.toast.showShortBottom($translate.instant("checkNetWorkConnection"));
            $ionicLoading.hide();
            var response1 = JSON.parse(JSON.stringify(localStorage.getItem(data + action)));
            return $http.get('').then(function(response) {
                return response1;
            });
        }
    }

Controller.js - 回复回复。

Services.webServiceCallPost('', appConst.services.get_menu_card).then(function(response) {
                    $ionicLoading.hide();
                    console.log("Response:     " + JSON.stringify(response));

                    if (response[1].response.status == 1) {
                        if (response[0].data.menu.length > 0) {
                            var categoryResponse = [];
                            angular.forEach(response[0].data.menu, function(value, key) {
                                if (value.menu_image_name != '') {
                                               var extraData = {
                                                        imageUrl: appConst.serviceUrl.menu_image_url + value.menu_image_name
                                                    }
                                } 
                                else {
                                    var extraData = {
                                        imageUrl: 'img/screen.png'
                                    };
                                }
                                angular.extend(value, extraData);
                                categoryResponse.push(value);
                            });
                            $rootScope.categories = globalMethods.getDashboardGridView(categoryResponse, 2);
                        }
                        if (response[0].data.addons.length > 0) {
                            $rootScope.totalAddons = [];
                            angular.forEach(response[0].data.addons, function(value, key) {
                                var extraData = {
                                    "finalCost": value.price,
                                    "quantity": 1,
                                    imageUrl: appConst.serviceUrl.addon_image_url + value.addon_image
                                };
                                angular.extend(value, extraData);
                                $rootScope.totalAddons.push(value);


 });
                    }
                    $scope.getSiteSettings();
                }
                $rootScope.dashboardHistoryId = $ionicHistory.currentHistoryId();
            });

控制台输出: 当我从json看起来漂亮的印刷它看起来一样。

在线回复:https://codepaste.net/op0boq

缓存响应:https://codepaste.net/y3bkd6

问题: TypeError:无法读取未定义的属性“status”

当我想得到回复1时,response.status确定了。 但是当我离线并且我得到了cachedResponse 1。response.status它的恢复状态是未定义的。但完全相同的数据,为什么?

Offline else statement.

2 个答案:

答案 0 :(得分:0)

如果此代码

var cachedResponse = JSON.parse(JSON.stringify(localStorage.getItem('' + appConst.services.get_menu_card)));

使用异步调用

console.log("Cached Response:     " + cachedResponse);

不会等待它完成并且会打印未定义的

答案 1 :(得分:0)

感谢@PatrickEvans的回答

  

然后你可能没有返回正确的东西......但你也不应该做JSON.parse(JSON.stringify(localStorage.getItem())它应该只是JSON.parse(localStorage.getItem() )localStorage项目已经是字符串,字符串化它将搞乱你想要做的事情

  

返回$ q.when(response1);