内部循环中的Ajax调用需要顺序响应

Fra*_*rez 1 javascript queue ajax jquery promise

我需要进行3次或更少的ajax调用,并且响应需要按照请求的顺序附加到dom.

我有以下功能,但问题是我得到的响应在被附加到dom时不一定是正确的顺序.

我不想使用async:false属性,因为它会阻止UI,当然它会受到性能影响.

mod.getArticles = function( ){
    //mod.vars.ajaxCount could start at 0-2
    for( var i = mod.vars.ajaxCount; i < 3; i++ ){
        //mod.vars.pushIds is an array with the ids to be ajaxed in
        var id = mod.vars.pushIds[i];

        $.ajax({
            url: '/ajax/article/' + id + '/',
            type: "GET",
            dataType: 'HTML',
            error: function() {
                console.error('get article ajax error');
            }
        }).done( function( data ) {
            if (data.length) {
                mod.appendArticle( data );
            } else {
                console.error('get article ajax output error');
            }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

eku*_*ela 5

您需要根据i您拥有的变量将文章附加到某个位置.或者您可以等待所有请求,然后按顺序附加它们.像这样的东西:

mod.getArticles = function( ){
    var load = function( id ) {
        return $.ajax({
            url: '/ajax/article/' + id + '/',
            type: "GET",
            dataType: 'HTML',
            error: function() {
                console.error('get article ajax error');
            });
        };
    var onDone = function( data ) {
            if (data.length) {
                mod.appendArticle( data );
            } else {
                console.error('get article ajax output error');
            }
        };
    var requests = [];
    for( var i = mod.vars.ajaxCount; i < 3; i++ ){
        requests.push(load(mod.vars.pushIds[i]));
    }

    $.when.apply(this, requests).done(function() {
        var results = requests.length > 1 ? arguments : [arguments];
        for( var i = 0; i < results.length; i++ ){
            onDone(results[i][0]);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)