2017-10-06 44 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})是不好的做法嗎? –

相關問題