我有一个用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它的恢复状态是未定义的。但完全相同的数据,为什么?
答案 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);