Javascript 离开作用域时丢失数据
我正在用javascript编写一些东西,在某一点上我调用了ajax 我将数据存储在对象文字中,但当我离开作用域时,我会丢失数据(即使是在对象文字中) 我不明白这里发生了什么Javascript 离开作用域时丢失数据,javascript,ajax,scope,Javascript,Ajax,Scope,我正在用javascript编写一些东西,在某一点上我调用了ajax 我将数据存储在对象文字中,但当我离开作用域时,我会丢失数据(即使是在对象文字中) 我不明白这里发生了什么 var menusView = { menusRep: null, init: function () { this.menusRep = menusRepository; this.getMenus(); }, getMenus: function () { $.ajax({ u
var menusView = {
menusRep: null,
init: function () {
this.menusRep = menusRepository;
this.getMenus();
},
getMenus: function () {
$.ajax({
url: 'data/voordeelmenus.json',
dataType: 'json',
success: function (data) {
menusView.menusRep.menus = data;
console.log(data);//console output: [object, object,...]
console.log(menusView.menusRep.menus);//console output: [object, object,...]
},
error: function (error) {
alert("error reading file: " + error);
}
});
console.log(menusView.menusRep.menus); //console output: []
}
}
var menusRepository = {
menus: []
}
我想我包括了所有重要的代码
提前谢谢 那
console.log(menusView.menusRep.menus); //console output: []
必须位于ajax调用内部,因为它是异步的。否则它将永远是空的
编辑:记住打电话
menusView.init();
否则,menusView.menusRep将为空
希望有帮助
Dan我认为这是由于AJAX的异步特性以及您如何使用它。最终的console.log是在AJAX调用完成之前触发的,因此在生成console.log时数据不可用 在我看来,你有几个选择。您可以在成功回调中使用返回的数据,在成功回调中使用处理返回数据的另一个方法,或者可以将async设置为false,以阻塞方式处理AJAX请求
$.ajax({
url: 'data/voordeelmenus.json',
dataType: 'json',
async: false,
success: function (data) {
menusView.menusRep.menus = data;
console.log(data);//console output: [object, object,...]
console.log(menusView.menusRep.menus);//console output: [object, object,...]
},
error: function (error) {
alert("error reading file: " + error);
}
});
你基本上有两行
$.ajax(...)
console.log(...)
ajax行调度ajax调用和回调,在ajax调用返回时调用回调,但不阻塞:它是异步的
计划完成后,将调用console.log,但尚未设置菜单。只有在ajax调用返回时,才会进行设置。您的ajax调用是异步的 因此,当代码执行到达console.log(menusView.menusRep.menus)时; 当时,您的对象没有收到任何数据
将您的console.log(menusView.menusRep.menumes)放入;在ajax调用的成功处理程序内部但是ajax调用背后的全部含义是我可以将菜单存储在menusRepository中。(所以我只需要1个ajax调用)现在它只要离开作用域就可以删除数据,然后您应该在ajax调用menusRepository=[something]中执行,我不在menusView.menusRep.menus=data中执行该操作;那么?