0

我正在编写一个小型 Flickr 图像采集器应用程序,我们在自己的服务器上有一个 JSON 代理。下面的函数从给定的照片集中抓取图像id

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,它是完全有效的。

4

3 回答 3

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

除非您将请求设置为同步,否则这将不起作用,这会带来更严重的问题。

于 2012-07-11T17:42:45.807 回答
2

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

于 2012-07-11T17:43:24.167 回答
1

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

return data; //undefined?!

该代码在 中的代码之前执行,function (res)就是data未定义的原因。如果你想对 做一些事情data,你需要传递一个回调函数,getPhotosFromPhotoset该回调函数将由 的success回调执行getJSON

那有意义吗?

于 2012-07-11T17:45:18.630 回答