2010-08-24 53 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; 
}