2010-08-24 52 views
3

好了,所以我有這樣的功能:jQuery的回報後數據

function getAreas(){ 
     $.post("/custom_html/weathermap.php",'', 
      function(data){ 

       return data 

      }, "json"); 


} 

工作正常。現在我想要做的是將數據傳回變量,換句話說:

var data=getAreas() 

但它不返回任何內容。有沒有辦法讓這個工作?

Thanx提前尋求幫助。

回答

13

這是一個異步調用,所以你不能像這樣返回。

您必須將代碼與data一起移動到回調函數(function(data){})中。

function getAreas(){ 
     $.post("/custom_html/weathermap.php",'', 
      function(data){ 

       //do something with data here, such as calling another function 

      }, "json"); 
} 

需要一段時間才能讓自己的頭腦進入異步思維方式,但是你會解決它。基本上,一旦請求被髮送,發送請求的代碼就完成了。該線程的執行將完成,並且您的瀏覽器將只是坐在那裏,不做任何事情。那麼$.post調用將從weathermap.php獲取數據,並且將調用您的回調函數。這開始了一個全新的執行線程。嘗試將它們看作兩個完全獨立的執行,一個pre-ajax調用和一個post-ajax調用。

下面是一些ASCII善良:

 V 
     | 
User clicks button 
(or something else happens) 
     | 
     | 
Your JavaScript runs 
     | 
     | 
And eventually gets 
to the ajax call  -------> SERVER ------>  Server sends data back 
                  | 
                  | 
               And your callback is run 
               on the data and execution 
               continues from here 
                  | 
                  | 
                  V 
-3

試試這個

function getAreas(){ 
    var ret; 
    $.post("/custom_html/weathermap.php",'', function(data){ 

      ret = data; 

     }, "json"); 

    return ret; 
} 
+2

不,是行不通的 - 'ret'是不確定的。 – Skilldrick 2010-08-24 11:52:50

+0

不是匿名函數的範圍與getAreas的範圍相同嗎? [edit]顯然我錯了,對不起:) – 2010-08-24 11:54:11

+0

匿名函數是一個回調函數,只會在'getAreas'返回後纔會調用。 – Skilldrick 2010-08-24 11:56:13

2

功能異步調用 - 這意味着,回調部分在某一點在未來,而你的主getAreas執行()函數立即返回。在這種情況下,它不會返回任何內容,因爲您的主函數中沒有返回語句。

爲了得到這個工作,需要在調用getAreas()之前將代碼分離爲需要發生的事情以及之後會發生的事情。

然後,你可能最終的東西,如:

function getAreas(){ $.post("/custom_html/weathermap.php",'', onGetAreasComplete, "json"); 
} 

function onGetAreasComplete(data) 
{ 
    // do whatever you need to do with data 
} 


// do whatever you need to do before getAreas() 

getAreas(); 

希望是有道理的。

6

可以歸檔,通過異步設置爲false

jQuery.loadView = function(url,data){ 
    var idata; 
    $.ajax({ 
     type: 'POST', 
     url: url, 
     data: data, 
     dataType: 'html', 
     async: false, 
     success: function(result){idata = result;} 
    }); 
    return idata; 
}