2010-04-13 132 views
1

我有一個jQuery ajax調用的問題。 我需要等待呼叫完成才能返回值。 但是,腳本似乎跳到了前面,而不是等待呼叫結束。 我的函數然後返回「undefined」。jQuery在繼續之前等待Ajax調用結束

我試圖使用.ajax()方法並將async的值設置爲false,但這也不起作用。

我可以讓我的函數返回我可以通過ajax調用的值嗎?

謝謝!

下面是代碼:

function get_rsrce_name(){ 

    jQuery.post(

     '<?php echo admin_url('admin-ajax.php'); ?>', 

     { action :'my_action', option_rsrce : 'option_rsrce' }, 

     function(data) { 

      output = data.option_name;   

     }, 

     "json" 
    );  

    return output; 
} 
+0

類似的SO:http://stackoverflow.com/questions/2956261/got-stuck-in-the-asynchronous-nature-of-ajax你可以通過在回調參數傳遞給get_rsrce_name()做到這一點-REQUESTS – 2010-06-03 16:02:34

回答

2

當你告訴它來同步運行它不工作的原因是變量「輸出」的回調函數的範圍之內只被定義。

幾乎可以肯定有更好的方法來做你想做的事情,但沒有更多的上下文,這將是很難解釋可能是什麼。

我推薦的「javascript變量範圍」

1

什麼喬希說,你已經劃定範圍與「輸出」變量問題展開閱讀了。你可以修復,通過在你的函數,像這樣的頂級聲明輸出:

var output; 
+0

我不認爲範圍的問題,並宣佈'output'頂部也無濟於事。問題是'$ .post'的異步性質。 – meagar 2010-04-14 15:01:33

+0

的OP提到,他們把它通過設置異步同步調用:假的。 – 2010-04-14 15:44:19

-1

jQuery的。員額()方法默認爲異步運行,即:後()函數不停止,並等待響應,它只是立即返回並且腳本的其餘部分繼續向前。在這種情況下,它繼續向您的return聲明。

現在我們已經下降到經典的競爭條件...... AJAX請求可以完成並執行function (data),然後腳本的其餘部分繼續向回程調用?由於大多數網絡都有以毫秒爲單位的延遲,並且回調只會在微秒後執行,很可能不會......回報每次都會贏得比賽。

您必須重新排列代碼,以便調用AJAX請求的外部函數可以通過AJAX請求的結果重新調用。

一個簡單的方法來做到這一點是讓兩部分功能:

function do_ajax(parameters, data) { 
    if (data == null) { 
     jquery.post(
      .... 
      success: function(data) { do_ajax(parameters, data); } 
     ); 
    } else { 
     ... handle response here ... 
    } 
} 

這種方式,功能可與你需要傳遞到AJAX調用(parameters)的任何數據被調用, data參數最初爲空。該函數看到數據爲空,並執行AJAX的東西。一旦來自服務器的響應回來,該函數會再次調用它自己,但是它會提供響應數據,並調用處理數據的函數的其他部分。

+0

很高興我不必維護你的代碼。這是我可能想到的最荒謬的做法。你爲什麼要再次調用do_ajax,而不是隻有一個處理響應的函數? – 2010-04-14 11:58:55

+0

@Keith我猜這對他來說似乎更緊湊?但是,這是一種非常全面的做事方式。將兩個函數組合成一個,通過一個巨大的if/else重載是一個相當混亂的想法,更不用說它遞歸地調用它自己了。 – meagar 2010-04-14 14:42:24

+0

@凱斯。 ajax請求者調用自己或調用另一個函數有什麼區別?無論哪種方式,它都需要調用一個函數來完成數據處理。至少這樣,請求和處理邏輯保持在一起。使用一些合適的包裝函數,所以你不會亂拋垃圾的代碼重複的URL定義和什麼,我發現這比維護「getX」和「handleX」函數的代碼更容易維護。 – 2010-04-14 15:43:30

0

我不希望你的問題成爲範圍問題,因爲JavaScript具有函數範圍,而不是範圍範圍。在函數的任何位置聲明的變量在函數的其他任何地方都可用。這就是爲什麼JSLint困擾你在頂部宣佈它們是:不是因爲它的重要功能,而是因爲它會提醒你,你的變量可用好像他們在頂部聲明無論在哪裏你實際申報。試試這個簡單的例子:

function ajax(callback) { callback(); } 
$(function() { 
    ajax(function() { x = 7; }); 
    alert(x); // x == 7 
}); 

問題是你$.post調用是異步的。行前output = data;你到達線return output;。這是因爲,立即$.post回報,並允許程序繼續運行,而一個潛在的慢AJAX調用發生。當AJAX呼叫完成時,它將觸發其complete回叫。

您需要調整您的代碼,這樣你做你的有價值的東西,你傳遞給$.post回調函數內。

function get_rsrce_name(onComplete) { 
    $.post(url, data, function(data) { onComplete(data); }); 
} 
相關問題