Javascript 通过ajax回调更改js中的对象
我基本上是试图在ajax回调之外修改一个对象,但结果并不像我最初预期的那样。我已经将我的项目简化为一个非常容易理解的例子,但显然有些东西我没有掌握 下面是包含ajax请求和回调的函数:Javascript 通过ajax回调更改js中的对象,javascript,jquery,ajax,Javascript,Jquery,Ajax,我基本上是试图在ajax回调之外修改一个对象,但结果并不像我最初预期的那样。我已经将我的项目简化为一个非常容易理解的例子,但显然有些东西我没有掌握 下面是包含ajax请求和回调的函数: var testFun = function(obj){ $.get("test.xml",function(xml){ //parse xml here... obj.name = "B"; }); }; 这是函数之外的代码: var o1 = new Object(); o
var testFun = function(obj){
$.get("test.xml",function(xml){
//parse xml here...
obj.name = "B";
});
};
这是函数之外的代码:
var o1 = new Object();
o1.name = "A";
console.log(o1);
testFun(o1);
console.log(o1);
我本来希望有这样一个输出:
Object {name: "A"}
Object {name: "B"}
但相反,我得到了输出:
Object {name: "A"}
Object {name: "A"}
据我所知,对象是作为对象引用的副本传递的,因此任何属性更改都应该保持不变。我在这里遗漏了什么?如何在回调中实际更改该对象
编辑:
这就是我如何解决问题的原因
这是发出ajax请求所调用的函数
function testFun(obj){
return $.get("test.xml",function(xml){
obj.name = "B";
});
}
这是调用函数的代码
var o1 = new Object();
o1.name = "A";
console.log(o1);
testFun(o1).done(function(result){
console.log(o1);
}).fail(function (){
console.log("error");
});
这是预期的和实际的输出:
Object {name: "A"}
Object {name: "B"}
如果希望console.log在第二种情况下工作,则必须将其放在将在$.get函数内调用的函数内,或者直接放在$.get函数内。 它目前不起作用,因为正如您的帖子下面的评论所说,$.get函数是异步的。 我记得您可以通过将属性“async”设置为false或其他方式来强制它是同步的 编辑:正如James Thorpe所提到的,您应该避免强制执行同步请求(参见下面的注释) 这应该行得通
var o1 = new Object();
o1.name = "A";
printMyObject(o1);
testFun(o1);
var testFun = function(obj){
$.get("test.xml",function(xml){
//parse xml here...
obj.name = "B";
printMyObject(obj);
});
};
function printMyObject(obj){
console.log(obj);
}
这是因为
$.get
函数是异步的。这意味着在obj.name
设置为B
之前执行第二个console.log(o1)
。依赖于请求检索的数据的所有逻辑都需要放在$.get
回调函数中,如果您试图根据返回数据中的内容设置名称,则可能会重复该逻辑。obj.name=“B”代码>此处obj
不是同一个对象。还有一件事我需要说的是,控制台语句在ajax完成之前运行。所以输出是正确的。关于同步请求,表示它们正在被弃用和删除。Chrome(至少不确定其他浏览器)在使用时已经显示了警告。在这个阶段,我不会将它们引入任何新代码。async:false
是一种糟糕的做法,因为它会阻塞UI。从来没有任何必要使用它,正如所指出的那样,浏览器正在弃用它