Javascript 通过ajax回调更改js中的对象

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

我基本上是试图在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"}
据我所知,对象是作为对象引用的副本传递的,因此任何属性更改都应该保持不变。我在这里遗漏了什么?如何在回调中实际更改该对象

编辑: 这就是我如何解决问题的原因 这是发出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。从来没有任何必要使用它,正如所指出的那样,浏览器正在弃用它