0

この関数を .js ファイルで宣言し、.html ファイルで呼び出しています。

function getTotalPages() {
    var valuePage;
    $.getJSON('Data/product.json').
        done(function(data) {
        $.each(data, function(key, value) {
                valuePage=value;
            });
        });
    //alert('out');
    return valuePage;
}

上記の関数は「アラート」なしで「未定義」を返しますが、アラートありでうまく機能しています。誰でもこれについて私を助けることができますか?

前もって感謝します。

4

3 に答える 3

4

この問題は何千回も回答されています。「非同期リクエストから値を返す方法がない」ということです。やりたいことはすべて、コールバックvaluePage内で行う必要があります。done

于 2012-11-21T09:43:37.767 に答える
2

ajax リクエストが非同期であるため、機能していません。alert を使用すると、値が返されるまでのタイムアウトがあります。追加することでスクリプトを機能させることができます(同期リクエストを作成できないasync: false クロスドメインリクエストに注意してjsonpください!)が、リクエストの準備が整うまでJSがブロックするため、実際にはお勧めしません。より良いアプローチは、コールバックを使用することです:

function getTotalPages(callback) {
  var valuePage;
    $.getJSON('Data/product.json').
        done(function(data) {
            $.each(data, function(key, value) {
            if (typeof callback === 'function') {
                callback(value);
            }
        });
    });
}

非同期リクエストを使用してこれを行う方法の例を次に示します。

function getResult(callback) {
    var url = 'https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=mgechev&count=3';
    $.ajax({
        url: url,
        success: function (data) {
            if (typeof callback === 'function') {
                callback(data);
            }
        },
        dataType: 'jsonp'
    });
}

getResult(function (data) {
    var variable = data;
    alert(variable);
});​

JSFiddle: http://jsfiddle.net/vWnHJ/

この例では、関数に関数を渡しgetResult、リクエストから受け取ったデータで指定された関数を呼び出します。

于 2012-11-21T09:44:07.217 に答える
1

AJAX は非同期です。アラート メッセージを閉じるまでに、戻り値は解決されますが、アラートがなければ早すぎます。同期リクエストを作成するか、コールバックを使用できます。

于 2012-11-21T09:43:58.383 に答える