2011-07-30 55 views
0

我試圖發送請求,然後在回調函數中,更改參數,然後再次發送請求。事情是這樣的:JavaScript變量引用問題

function sendRequest() { 
    params = {param1:'value', param2:'value'}; 
    while(params) { 
     $.getJSON("url", params, function(data) { 
      if(data contains something important) 
       params.foo = bar; 
      else 
       params = null; 
     }); 
    } 
} 

params永不改變和while循環繼續,直到永遠。這似乎是一個參考問題;但我無法弄清楚如何解決這個問題。提前致謝。

回答

1

的問題是,getJSON是異步的。

  1. while(params)執行。這是真的,所以我們繼續
  2. $.getJSON被調用。傳遞給它的函數此時不會被調用。它只是排隊等待子系統,以後將執行實際的請求 - 異步。
  3. while(params)再次執行。傳遞給getJSON的回調尚未有機會運行,因此params未變。
  4. 轉到步驟2.

換句話說,您創建了一個無限循環,因爲這樣處理排隊的回調函數永遠不會因爲無限循環的執行系統。你最終要做的就是創建一個無限長的隊列列表getJSON調用。

一個更好的解決辦法是這樣的:

function sendRequest(params) { 
    $.getJSON("url", params, function(data) { 
     if(data contains something important) 
      params.foo = bar; 
      sendRequest(params); 
     else 
      params = null; 
      // Probably do something like requestChainFinished(params); 
    }); 
} 

sendRequest({param1:'value', param2:'value'}); 

通過使用功能,您採取流量控制,直到異步回調getJSON被稱爲不執行另一個請求。

+0

非常感謝,它的工作。我只是沒有注意到它是異步的。 –

+0

由於您似乎是Stack Overflow的新手,請確保您通過單擊複選標記來回答您的問題的答案。 –

0

'params'是一個閉包變量。當異步ajax調用的響應到達時,params的值在回調的稍後時間發生變化,但您的while循環保持JS引擎忙,以至於回調不會被調用。

要麼你可以保持通話的響應回調同樣的功能,也可以使用async: false這樣$.ajax({ async: false, ...