11

I am new to jquery and I am trying to assign a value to a variable after an ajax call but it returns undefined. My code is below:

function prepareDocument() {
var a = getAverageRating(1);
alert(a);
}
function getAverageRating(pageId) {
$.ajax({
    url: "../services/rating.ashx?action=getAverageRating&pageId=" + pageId,
    dataType: "text",
    type: "GET",
    data: {},
    error: function (err) {
        displayDialogBox("Error", err.toString());
    },
    success: function (data) {
        return data;
    }
});
}

Any help would be appreciated. Thanks,

4

1 に答える 1

14

これは、非同期操作の使用に慣れていない人にとって非常に一般的な問題です。通常のシーケンシャル スタイルでプログラムすることはできないため、コードの構造を再考する必要があります。

非同期 ajax 呼び出しの成功ハンドラーから値を返すことはできません。ajax cll はかなり前に完成し、すでに戻ってきました。成功ハンドラーから値を返すことは、コードに戻るのではなく、ajax コードの内部に入るだけです。

代わりに、成功ハンドラーまたは成功ハンドラーから呼び出す関数で ajax 呼び出しの結果を使用する必要があります。

特定のケースでは、getAverageRating()関数はおそらくコールバック関数を受け取る必要があり、評価が取得されると、コールバック関数が呼び出されます。値はすぐに返され、その後、ajax 呼び出しが完了し、実際のデータを使用して ajax 関数の成功ハンドラーが呼び出されるため、値を返すことはできません。

function prepareDocument() {
    getAverageRating(1, function(data) {
        alert(data);
    });
}

function getAverageRating(pageId, fn) {

    $.ajax({
        url: "../services/rating.ashx?action=getAverageRating&pageId=" + pageId,
        dataType: "text",
        type: "GET",
        data: {},
        error: function (err) {
            displayDialogBox("Error", err.toString());
        },
        success: function (data) {
            fn(data);
        }
    });

}
于 2013-06-10T00:10:25.010 に答える