2017-10-06 60 views
0

我有两个模块,并且在第一个模块中声明了一个对象,因为我知道基元是通过java脚本中的值传递的和对象的引用。我想从请求中获取响应状态,并将对象作为参考传递,以便我可以修改它的属性。问题在于它没有做任何事情。最后,值会是一样的。在java脚本中更改函数内部某个对象的属性值不起作用,因为它应该是

//this code is in a different module from the other one 
 
var variableToBeChanged = { something : "Initial value" }; 
 
anotherModule.changeValue(variableToBeChanged); 
 
alert(variableToBeChanged.something); 
 

 
//and in the other module I have a $.ajax and I want to get the response status(ex. 200) 
 

 
//the code is sth like this: 
 

 
function AnotherModule(ajax){ 
 

 
    function changeValue(variableToBeChanged){ 
 
    ... 
 
    ... 
 
    ... 
 
    $.ajax({ 
 
     ... 
 
     ... 
 
     ... 
 
     success: function(data,xhr){ 
 
      variableTobechanged.something = xhr.status; 
 
     } 
 
    }); 
 
    } 
 

 
}

最终它将显示: “初始值”,而不是200或其他任何东西。 我在这里做错了什么?

+1

的变量被异步改变,所以你必须使用的承诺或回调进入新的价值 –

回答

0

在对象的引用的JavaScript副本被传递。

这意味着在函数完成执行后,对对象所做的任何更改都将显示给您。

由于javascript是异步的,alert(variableToBeChanged.something)这行在函数返回前被执行。所以你看到了旧的价值。你必须使用回调或承诺来同步工作。

请参阅这个问题javascript pass object as reference。它很好地解释了这个概念。

1

ajax调用是异步因此在变量被修改之前调用警报。您可以在ES6中使用承诺,以确保它在ajax调用完成后执行。

new Promise((resolve) =>{ 
      anotherModule.changeValue(variableToBeChanged); 
      resolve(); 
     }).then((res) =>{ 
      alert(variableToBeChanged.something); 
     }).catch((error) =>{ 
      alert(error); 
    }); 
+0

在你的情况,你也可以考虑返回递延对象,阿贾克斯()返回,并使用完成或失败的方法,因为你似乎有兴趣是否调用成功或失败的模块。 [请参阅jqXHR对象](http://api.jquery.com/jquery.ajax/)。 – Stefan

+0

Hi @Stefan,是的,我们可以在成功或失败的情况下从ajax调用返回对象,并据此解决或拒绝承诺。 –

+0

感谢您的评论!我有一个问题:使用jQuery.ajaxSetup({async:false})和jQuery.ajaxSetup({async:true})是不好的做法吗? –

相关问题