2012-07-11 87 views
0

我正在写一个小型的Flickr图像采集卡应用程序,并且我们在我们自己的服务器上有一个JSON代理。下面的函数抓取id给出的photoset中的图像。javascript变量是undefined

function getPhotosFromPhotoset(p_id) { 
    var data; 
    $.getJSON('/flickr_get_photos', { 
     photoset_id: p_id 
    }, function(res) { 
     data = res; 
     console.log("res: " + JSON.stringify(data)); 
     if (res.status == 'ok') { 
      if (res.data.length > 0) { 
       //nada                                
      } else { 
       data.status = "error: Photoset has no photos."; 
      } 
     } else { 
      data.status = "An unknown error occurred; please try again."; 
     } 
    }); 
    return data; //undefined?! 
} 

为什么data突然变得不确定?当我console.log它在getJSON内,它是完全有效的。

+2

Ajax是异步的。 – jbabey 2012-07-11 17:42:51

回答

4

该函数在ajax请求被创建之前很久就返回。在回调函数中使用data(您实际上将其记录在回调函数中,并保证可用)。 $.getJSON不仅仅是为了娱乐而采用回调函数,而正是出于这个原因。

你可以这样做,但:

function getPhotosFromPhotoset(p_id) { 
    return $.getJSON('/flickr_get_photos', { 
     photoset_id: p_id 
    }); 
} 

getPhotosFromPhotoset(1).then(function(data) { 
    //Use data here 
}); 

,而不是试图做的事:

var data = getPhotosFromPhotoset(1); //will not work 

,除非你设定的要求同步,它有更糟糕的问题,这是行不通的。

2

它不会突然变得未定义。 getJson是一个异步调用,设置data值的函数是服务器返回响应时调用的函数,getPhotosFromPhotoset在完成执行之前不等待服务器响应,因此数据值尚未设置任何值。

+0

如何让电话等待通话结束? – tekknolagi 2012-07-11 17:44:19

+0

你不想,同步服务器端调用块页面功能。您需要重构调用getPhotosFromPhotoset函数以期望回调而不是返回值的函数。 – JaredMcAteer 2012-07-11 17:45:11

+0

我很困惑我将如何使用回调......你是什么意思? – tekknolagi 2012-07-11 17:46:36

1

AJAX异步执行的,所以当你说:前

return data; //undefined?! 

那代码执行function (res)的代码,这就是为什么data是不确定的。如果您想对data执行某些操作,则需要将回调函数传递给getPhotosFromPhotoset,该函数将由success回调getJSON执行。

这有道理吗?