1
var links = [];

function getFeed() {
    $.getJSON("http://www.reddit.com/.json?jsonp=?", function (data) {
        $.each(data.data.children, function (i, item) {
            var url = item.data.url;
                links.push(url);
        });

    alert("Inside request: " + links.length);

    });
}

getFeed();

alert("Outside request: " + links.length);

結果:

Outside request: 0
Inside request: 25

リクエストが非同期のように見えるので、リクエストからのデータを同期的に使用するようにコードを修正するにはどうすればよいですか?

ここで明らかな何かが欠けている場合は申し訳ありません...

4

4 に答える 4

1

getJSON非同期関数です。データにアクセスする唯一の信頼できる方法は、関数スコープ内です。必要なことは何でもlinks関数内で実行できますよね?

于 2013-07-15T22:31:20.527 に答える
1

getFeed() にコールバックを追加します。

var links = [];

function getFeed(callback) {
    $.getJSON("http://www.reddit.com/.json?jsonp=?", function (data) {
        $.each(data.data.children, function (i, item) {
            var url = item.data.url;
                links.push(url);
        });

    alert("Inside request: " + links.length);
    callback();
    });
}

getFeed(function(){

    alert("Outside request: " + links.length);

);
于 2013-07-15T22:31:45.577 に答える
1

AJAX は非同期であるためalert、上記のコードの は、実行が終了した直後に起動されますgetFeed

問題は、getFeed は $.getJSON が実行を終了するための応答を返すのを待たず、AJAX 要求をセットアップして送信し、すぐに実行を終了することです。その時までにサーバーが応答する可能性はほとんどありません。 $.getJSON リクエスト。

これが、非同期プログラミングでコールバックを使用する理由です ($.getJSON 呼び出しの関数宣言を見てください)。応答がいつ完了したかを 100% 確信することはできませんが、応答が完了するたびにコールバックをアタッチできます。 、必要な操作を実行できます。

要するに、応答に依存するものをコールバックに配置するか、コールバックの起動に依存して実行する必要があります。

于 2013-07-15T22:32:34.400 に答える
1

これは JSONP リクエストなので、実際にはできません。<script>JSONP リクエストは、JSON を引数としてグローバル コールバック関数を実行するタグを作成することによって行われます。これらは通常の AJAX リクエストではありませんが、jQuery ではそのように見えます。

コールバックを使用する方が簡単です。

function getFeed() {
    return $.getJSON("http://www.reddit.com/.json?jsonp=?").pipe(function(data) {
        return $.map(data.data.children, function(item) {
            return item.data.url;
        });
    });
}

getFeed().done(function(links) {
    console.log(links)
});
于 2013-07-15T22:35:31.393 に答える