通过ajax回调改变js中的对象

时间:2015-07-16 12:53:58

标签: javascript jquery ajax

我基本上试图改变我的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"}

1 个答案:

答案 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);
}