多个ajax调用的jQuery回调

Mis*_*aak 126 ajax jquery callback

我想在点击事件中进行三次ajax调用.每个ajax调用都执行不同的操作,并返回最终回调所需的数据.呼叫本身并不依赖于彼此,它们都可以同时进行,但是当所有三个呼叫完成时,我希望最终回调.

$('#button').click(function() {
    fun1();
    fun2();
    fun3();
//now do something else when the requests have done their 'success' callbacks.
});

var fun1= (function() {
    $.ajax({/*code*/});
});
var fun2 = (function() {
    $.ajax({/*code*/});
});
var fun3 = (function() {
    $.ajax({/*code*/});
});
Run Code Online (Sandbox Code Playgroud)

Gre*_*eg 149

看起来你已经得到了一些答案,但是我认为这里有一些值得一提的东西会大大简化你的代码.jQuery $.when在v1.5中介绍了它.看起来像:

$.when($.ajax(...), $.ajax(...)).then(function (resp1, resp2) {
    //this callback will be fired once all ajax calls have finished.
});
Run Code Online (Sandbox Code Playgroud)

没看到这里提到它,希望它有所帮助.

  • 我同意这是一个很好的解决方案,当你有jQuery 1.5+时,但在答案时延迟功能不可用.:( (9认同)
  • 谢谢你的回答,这绝对是我的选择.它使用jQuery,它紧凑,简洁,富有表现力. (6认同)
  • Subhaze的答案很棒,但实际上,这是正确的. (2认同)

sub*_*aze 103

这是我写的一个回调对象,你可以设置一个单独的回调,一旦完成就会触发,或者让每个回调都有自己的回调,并在完成后全部触发它们:

注意

从jQuery 1.5+开始,您可以使用另一个答案中描述的延迟方法:

  $.when($.ajax(), [...]).then(function(results){},[...]);
Run Code Online (Sandbox Code Playgroud)

这里推迟的例子

对于jQuery <1.5,以下内容将起作用,或者如果您需要在未知时间触发ajax调用,如此处所示,带有两个按钮:单击两个按钮后触发

[用法]

对于单一的回调完成后:工作实例

// initialize here
var requestCallback = new MyRequestsCompleted({
    numRequest: 3,
    singleCallback: function(){
        alert( "I'm the callback");
    }
});

//usage in request
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.requestComplete(true);
    }
});
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.requestComplete(true);
    }
});
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.requestComplete(true);
    }
});
Run Code Online (Sandbox Code Playgroud)

完成后每个都有自己的回调:工作示例

//initialize 
var requestCallback = new MyRequestsCompleted({
    numRequest: 3
});

//usage in request
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.addCallbackToQueue(true, function() {
            alert('Im the first callback');
        });
    }
});
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.addCallbackToQueue(true, function() {
            alert('Im the second callback');
        });
    }
});
$.ajax({
    url: '/echo/html/',
    success: function(data) {
        requestCallback.addCallbackToQueue(true, function() {
            alert('Im the third callback');
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

[代码]

var MyRequestsCompleted = (function() {
    var numRequestToComplete, requestsCompleted, callBacks, singleCallBack;

    return function(options) {
        if (!options) options = {};

        numRequestToComplete = options.numRequest || 0;
        requestsCompleted = options.requestsCompleted || 0;
        callBacks = [];
        var fireCallbacks = function() {
            alert("we're all complete");
            for (var i = 0; i < callBacks.length; i++) callBacks[i]();
        };
        if (options.singleCallback) callBacks.push(options.singleCallback);

        this.addCallbackToQueue = function(isComplete, callback) {
            if (isComplete) requestsCompleted++;
            if (callback) callBacks.push(callback);
            if (requestsCompleted == numRequestToComplete) fireCallbacks();
        };
        this.requestComplete = function(isComplete) {
            if (isComplete) requestsCompleted++;
            if (requestsCompleted == numRequestToComplete) fireCallbacks();
        };
        this.setCallback = function(callback) {
            callBacks.push(callBack);
        };
    };
})();
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 10

没有看到任何对象malarky自己的需要.简单有一个整数变量.当您启动请求时,请递增该号码.当一个完成时,减少它.当它为零时,没有正在进行的请求,所以你已经完成了.

$('#button').click(function() {
    var inProgress = 0;

    function handleBefore() {
        inProgress++;
    };

    function handleComplete() {
        if (!--inProgress) {
            // do what's in here when all requests have completed.
        }
    };

    $.ajax({
        beforeSend: handleBefore,
        complete: function () {
            // whatever
            handleComplete();
            // whatever
        }
    });
    $.ajax({
        beforeSend: handleBefore,
        complete: function () {
            // whatever
            handleComplete();
            // whatever
        }
    });
    $.ajax({
        beforeSend: handleBefore,
        complete: function () {
            // whatever
            handleComplete();
            // whatever
        }
    });
});
Run Code Online (Sandbox Code Playgroud)


Cor*_*son 10

值得一提的是,由于$.when期望所有Ajax请求的顺序参数(不是数组),你会经常看到$.when用使用.apply()像这样:

// Save all requests in an array of jqXHR objects
var requests = arrayOfThings.map(function(thing) {
    return $.ajax({
        method: 'GET',
        url: 'thing/' + thing.id
    });
});
$.when.apply(this, requests).then(function(resp1, resp2/*, ... */) {
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
    var responseArgsArray = Array.prototype.slice.call(this, arguments);

});
Run Code Online (Sandbox Code Playgroud)

这是因为$.when接受这样的args

$.when(ajaxRequest1, ajaxRequest2, ajaxRequest3);
Run Code Online (Sandbox Code Playgroud)

而不是这样的:

$.when([ajaxRequest1, ajaxRequest2, ajaxRequest3]);
Run Code Online (Sandbox Code Playgroud)

  • 是的,我几乎总是通过在$ .when上应用一系列请求来使用它,而在这里的解决方案中没有发现它,因此只需在此处添加一个好例子即可。 (2认同)