2012-09-13 22 views
0

我有這個jQuery調用AJAX,jQuery的AJAX調用不設置變量的值

function findTaxForProcess(argPrc, argPrcAmount, argPrcDiscount) { 
      if (argPrc == '') { return 0; }; 
      var _valToReturn; 

      if ($('#hdnTaxBefore').val() == "true") { 
       // if tax is calculated before discount 
       $.ajax({ 
        url: '/AutoComplete.asmx/FindProcessTax', 
        type: 'POST', 
        timeout: 5000, 
        datatype: 'xml', 
        cache: false, 
        data: 'argProcess=' + argPrc + '&argAmt=' + argPrcAmount, 
        success: function (response) { 
         _valToReturn = $(response).find('double').text(); 
         alert(_valToReturn); 
        } 
       }); 
      } 

      else { 
       // the tax is calculated after discount 
       $.ajax({ 
        url: '/AutoComplete.asmx/FindProcessTaxAter', 
        type: 'POST', 
        timeout: 5000, 
        datatype: 'xml', 
        cache: false, 
        data: 'argProcess=' + argPrc + '&argAmt=' + argPrcAmount + '&argDiscount=' + argPrcDiscount, 
        success: function (response) { 
         _valToReturn = $(response).find('double').text(); 
         alert(_valToReturn); 
        } 
       }); 
      } 
      alert('came here ' + _valToReturn); 
      return _valToReturn; 
     }; 

的問題是第一個警報顯示2.873(在其他情況下,它顯示2.178),但問題是第二個警告,第二次提醒顯示,came here undefined ??? FTW?黑客出了什麼問題?我一直在這附近搞了兩天,但什麼也沒有!

爲什麼_valToReturn的值在第二次提醒時未定義?並首先定義?任何幫助?

編輯:警報came here _valToReturn是第一個警報後執行。所以,(幾乎!)所有回答者都表示,如果它之前來了,它將是不確定的,我知道,但正如我所說的,它之前之後正在執行

回答

2

Ajax是一個異步請求。成功事件執行時,警報「來到這裏未定義」將執行。到那時變量還沒有被初始化。

更新: 在回答你的問題密切關注,我相信 匿名函數將valToReturn視爲一個局部變量。因此,如果你願意的話,那些變量會在不同的「棧」上。

看到這個: Javascript anonymous function not updating global variable

或者

Using variable outside of ajax callback function

到你的類似。

+0

如果事實的確如此,爲什麼警告'警報(來到這裏+ _valToReturn')總是在**第一個警報之後執行**? – Razort4x

+0

@ Razort4x查看我更新的答案。我希望它有幫助。 –

0

嘗試初始化_valToReturn值擺脫未定義

0

如果第二警報至上,即如果未定義至上,然後價值,那是因爲AJAX的異步調用的。爲了克服這個問題,你可以使ajax調用同步。

如果第二個警報出現在第一個警報之後,那麼它可能與變量值有關。

0

,你可以嘗試使用的console.log發現這是第一次執行,在我的腦海裏,與警報「來到這裏」,應先執行,只是去看看螢火蟲或鉻控制檯