1

JQueryajaxコールから呼び出し元の場所にデータを渡す際に問題が発生しました。問題のコードは以下のとおりです。

jQuery("#button").click(function()
{   
    for(var i = 0;i < data.length; i++)
    {
        result = updateUser(data[i]); //result is not populated..
                    alert(result); //prints 'undefined'

    }
});

function updateUser(user_id)
{       
    jQuery.ajax({
        url:"/users/update/"+user_id,
        type:"GET",
        async: false,
        success: (function(data){           
            //if I alert "data" here it shows up correctly
                            //but if i try to return it like below 
                            //it does not get passed correctly 
                            return data; 
        })
    });

どんなポインタでも大歓迎です

4

5 に答える 5

5

そのようなAJAX成功ハンドラーから値を返すことはできません。AJAXは非同期であるため、実行は次の行に進みresultますundefined。非同期操作からデータを取り戻すことができる唯一の方法は、コールバックを使用することです。コールバックは、非同期操作が実行を終了したときに呼び出される関数です。

jQuery("#button").click(function () {
    for (var i = 0; i < data.length; i++) {
        updateUser(data[i], function(result) {
            alert(result);
        });
    }
});

function updateUser(user_id, callback) {
    jQuery.ajax({
        url: "/users/update/" + user_id,
        type: "GET",
        success: callback
    });
}

ここでは、AJAX呼び出しの成功ハンドラーでコールバックを呼び出しているため、AJAX呼び出しによって返されたデータにアクセスできます。

于 2012-09-13T20:52:37.533 に答える
1

ajaxのAは非同期です。つまり、ファイルが読み込まれると、ファイルを開始した関数が実行されます。jQuery Deferredを使用してみてください:http://api.jquery.com/category/deferred-object/

例:

jQuery("#button").click(function()
{   
    for(var i = 0;i < data.length; i++)
    {
        updateUser(data[i]).done(function(result) {
                    alert(result); //prints 'undefined'
        });

    }
});

function updateUser(user_id)
{
    return jQuery.ajax({
        url:"/users/update/"+user_id,
        type:"GET",
        async: false,
        success: (function(data){           
            ...
        })
    });
}
于 2012-09-13T20:51:14.113 に答える
1

関数returnを呼び出した結果にしますjQuery.ajax()-このオブジェクトはjQueryの遅延promiseインターフェースを実装します。つまり、しばらくして結果を返すことを約束するオブジェクトです。

function updateUser(user_id) {       
    return jQuery.ajax({...});
}

次に.done()、promiseが取得したときに呼び出される関数を登録するために使用しますresolved

updateUser(data[i]).done(function(result) {
    alert(result);
});

重要な部分は、オブジェクトを使用すると、非同期タスク(つまり、関数)の開始deferredを、そのタスクが完了した(または失敗した)ときに発生するはずのことと完全に切り離すことができるということです。updateUser

したがって、コールバック関数をに渡す必要はありませ.ajaxん。また、呼び出しを他の遅延オブジェクト(アニメーション、他のAJAXリクエストなど)とチェーンすることもできます。

さらに、変更することなく.done()、必要な数のコールバックとコールバックを登録できます。.fail()updateUser()

于 2012-09-13T20:53:17.147 に答える
0

成功関数を呼び出した関数はAjaxリクエストであり、UpdateUser関数ではありません。したがって、明らかにそれを返すと、成功コールバックから戻りますが、UpdateUser関数には戻りません。

また、ajaxは非同期であるため、コールバックが実行される時間を購入すると、UpdateUser関数から出力されます。

于 2012-09-13T20:52:04.013 に答える
-2

何が起こっているかはかなり確かですが(専門家ではありません)、updateUser関数全体ではなく、アノノミー関数の「データ」を正常に返しています。

function updateUser(user_id)
{       
    var retData;
    jQuery.ajax({
        url:"/users/update/"+user_id,
        type:"GET",
        async: false,
        success: (function(data){           
            //if I alert "data" here it shows up correctly
                            //but if i try to return it like below 
                            //it does not get passed correctly 
                            retData = data; 
        })
    return retData;
});

しかし、私が言ったように、私は専門家ではありません。

于 2012-09-13T20:52:27.617 に答える