1

これが私のセットアップです:私はいくつかの要素で.eachを呼び出しており、いくつかのチェックの後、いくつかのJSONデータを含むajaxリクエストを送信し、成功するとサーバーの応答を属性として各要素に適用します(通常はID)。その後、ID を配列にプッシュします。

問題は、明らかに ajax リクエストが非同期であり、すべての ajax が終了する前に要素 ID の配列を使用する関数が起動することです。

私は .when と .then を試しましたが、コールバック関数は ajax よりも先に起動され続けます。

これが私のコードの外観です(不要な部分をいくつか削除しました):

var order = [];

function sub(selector){

selector.each(function(){
    var out = {
        "some":"random",
        "stuff":"here"
    };
        $.ajax({
            type: "POST" 
            url: "/test/url",
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            data:JSON.stringify(out),
            success:function(response){
                $(this).attr("data-response",response);
                order.push(response);
            }
        })
    })
}

$("#button").click(function(){
    $.when(sub($(".test"))).then(function() {
        console.log(order);
        //i have to run the sub function twice so the order doesn't return undefined
    });     
});
4

5 に答える 5

1

問題は、when遅延オブジェクトに作用することですが、 sub は何も返さないため、whenすぐに起動します。したがって、必要なことは、ajax 呼び出しによって返されたすべての遅延オブジェクトを収集して返すことです。

var order = [];

function sub(selector){
    var deferredList = []
    selector.each(function(){
        var out = {
            "some":"random",
            "stuff":"here"
        };
        var deferred = $.ajax({
                type: "POST", 
                url: "/test/url",
                dataType: 'json',
                contentType: "application/json; charset=utf-8",
                data:JSON.stringify(out),
                success:function(response){
                    $(this).attr("data-response",response);
                    order.push(response);
                }
            })
        deferredList.push(deferred)
    })
    return deferredList;
}

$("#button").click(function(){
    $.when.apply($,sub($(".test"))).then(function() {
        console.log(order);
        //i have to run the sub function twice so the order doesn't return undefined
    });     
});

直接ではapplyなく使用する理由は、オブジェクトの配列をパラメーターとして受け入れず、これに対する回避策を提供するためです。whenwhenapply

于 2013-06-27T08:06:57.993 に答える
0

への引数は$.when()である必要がありますがDeferredsub()何も返されません。Deferredこのバージョンは、によって返されたすべての の配列を返し、それらすべてを引数として$.ajax呼び出します。$.whenその後、それらすべてを待ちます。

var order = [];

function sub(selector){
    return selector.map(function(){
        var out = {
            "some":"random",
            "stuff":"here"
        };
        return $.ajax({
            type: "POST" 
            url: "/test/url",
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            data:JSON.stringify(out),
            success:function(response){
                $(this).attr("data-response",response);
                order.push(response);
            }
        })
    })
}

$("#button").click(function(){
    $.when.apply(this, sub($(".test"))).then(function() {
        console.log(order);
        //i have to run the sub function twice so the order doesn't return undefined
    });     
});
于 2013-06-27T08:10:42.127 に答える
-2

属性 async : false を $.ajax - 呼び出しに追加します。次に、呼び出しが順番に行われます。

于 2013-06-27T08:13:58.490 に答える