我基本上试图改变我的ajax回调之外的对象,但结果并不像我最初预期的那样。我把我的项目简化为一个非常容易理解的例子,但显然我没有把握的东西。
这是包含ajax请求和回调的函数:
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"}
根据我的理解,该对象作为对象引用的副本传递,因此任何属性更改都应该坚持。我在这里缺少什么以及如何在回调中实际更改该对象?
修改 这就是我通过this post解决问题的方法 这是调用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"}
答案 0 :(得分:3)
如果您希望console.log在第二种情况下工作,您必须将它放在将在$ .get函数内调用的函数内或直接放在$ .get函数内。 它目前无法正常工作,因为正如你的帖子中的评论所述,$ .get函数是异步的。 我记得你可以通过放置属性" async"来强制它同步。虚假或某事......
编辑:正如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);
}