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コールバック関数を渡す必要があります。getPhotosFromPhotosetsuccessgetJSON

それは理にかなっていますか?

于 2012-07-11T17:45:18.630 に答える