javascript变量未定义

javascript variable is undefined

本文关键字:未定义 变量 javascript      更新时间:2023-09-26

我正在编写一个小型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突然变得未定义?当我在getJSONconsole.log时,它是完全有效的。

函数在发出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

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

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

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

return data; //undefined?!

该代码在function (res)中的代码之前执行,这就是data未定义的原因。若要对data执行某些操作,则需要向getPhotosFromPhotoset传递一个回调函数,该函数将由getJSONsuccess回调执行。

这有道理吗?