亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

針對多個Ajax調用的jQuery回調

針對多個Ajax調用的jQuery回調

心有法竹 2019-07-04 13:48:06
針對多個Ajax調用的jQuery回調我想在一個點擊事件中進行三個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*/});});
查看完整描述

3 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

下面是我編寫的一個回調對象,您可以在其中設置一個回調,一旦全部完成,或者讓每個回調都有自己的回調,并在所有回調完成后都啟動它們:

通知

由于jQuery1.5+可以使用另一個答案中描述的延遲方法:

  $.when($.ajax(), [...]).then(function(results){},[...]);

這里延遲的例子

對于jQuery<1.5,以下內容可以工作,或者如果您需要在未知的時間啟動Ajax調用,如下面兩個按鈕所示:點擊兩個按鈕后啟動

[使用]

單株回調完成后:工作實例

// initialize herevar 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);
    }});

各有他們自己當全部完成時回調:工作實例

//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');
        });
    }});

[守則]

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);
        };
    };})();


查看完整回答
反對 回復 2019-07-04
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

看起來您已經找到了一些解決這個問題的方法,但是我認為這里有一些值得提及的東西,它將極大地簡化您的代碼。jQuery引入了$.when在1.5節??雌饋恚?/trans>

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

我沒看到這里提到過,希望能有所幫助。


查看完整回答
反對 回復 2019-07-04
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

我自己也看不出需要什么東西。Simple有一個變量,它是一個整數。啟動請求時,增加該數字。當一個人完成的時候,減少它。當它為零時,沒有正在進行的請求,所以您完成了。

$('#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
        }
    });});


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 408 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號