2012-08-08 46 views
1

這裏是場景:我通過Web服務器從數據庫獲取數據。根據該數據頁面向同一服務器發送另一個請求以執行某些操作。簡化結構如下:使用jQuery從Web服務器獲取數據

var datacon; 
$.post('method',function(data){ 
    datacon = data; 
    // populating some tags; 
}) // end of post 
//some other staff happening; 
$.post('other',{datacon}, function(env){ 
...// taking data from populated tags 
    $("div").load(env); 
... 
}) // end of post 

每次用戶進入頁面時都會發生這種情況。在打開頁面時,此代碼不起作用,datacon爲空。但是,如果我將刷新一次或兩次,它就開始工作。第二個.post完美地工作,檢查了數百次。我用$ .get改變了第一個$ .post,但它沒有幫助。

可能它涉及異步/同步調用。我不明白爲什麼會發生。請幫忙。

p.s.服務器是CherryPy。

回答

1

由於這些調用是異步的,第二次調用可能在第一次調用完成之前運行。爲了確保它們以正確的順序運行,將第二個ajax調用放在第一個結尾處的done()函數中。這樣,第二個只會在第一個完成時運行。

這是從項目的樣品我的工作:

 

    $("#leftcolumn").activity(); 
    $.ajax({ 
      type: "GET", 
      url: "/search", 
      cache: false, 
      data: {searchterm: searchterm} 
      }).done(function(reply) { 
       $("#leftcolumn").activity(false); 
       showSearchResults(reply); 
       }); 

第一行顯示在屏幕上的進度指示器。然後ajax調用進行搜索。在.done最後,我禁用了我正在顯示的進度指示器,然後顯示搜索結果。把我想要在.done中執行的代碼保證它在ajax調用完成之前不會運行。

+0

邁克,請您再解釋一下嗎?什麼是done()函數? – 2012-08-08 19:51:30

+2

我相信Mike的建議可以通過將第二個POST移動到第一個POST的回調函數中來實現。 – ach 2012-08-08 20:07:31

+0

邁克,你太棒了。它確實有效。 – 2012-08-09 07:33:20

1

回調函數是異步執行的,也就是說,一旦從服務器接收到數據。您的第二個POST可能會在返回第一個POST的響應之前執行。您可以將您的第一篇文章()更改爲ajax(),並將「異步」設置爲「false」。請參閱http://api.jquery.com/jQuery.ajax/

雖然上述內容有點貴 - 理想情況下,取決於AJAX調用結果的所有內容都應在回調方法中進行。例如,嘗試在第一個POST的回調中移動第二個POST。像你試圖做的旗幟設置可以被認爲是代碼味道。

相關問題