JQuery- এ সমস্ত সক্রিয় আজাক্স অনুরোধগুলি বন্ধ করুন


216

আমার একটি সমস্যা আছে, যখন একটি ফর্ম জমা দেওয়ার সময় সমস্ত সক্রিয় এজাক্স অনুরোধ ব্যর্থ হয় এবং ত্রুটি ঘটায় তা ট্রিগার করে।

ট্রিগারিং ত্রুটির ইভেন্ট ছাড়াই কীভাবে jQuery এ সমস্ত সক্রিয় আজাক্স অনুরোধগুলি বন্ধ করবেন?

উত্তর:


273

প্রতিবার আপনি যখন একটি এজাক্স অনুরোধ তৈরি করবেন আপনি এটি সংরক্ষণের জন্য একটি ভেরিয়েবল ব্যবহার করতে পারেন:

var request = $.ajax({
    type: 'POST',
    url: 'someurl',
    success: function(result){}
});

তারপরে আপনি অনুরোধটি বাতিল করতে পারেন:

request.abort();

আপনি সমস্ত মুলতুবি থাকা এজাক্স অনুরোধগুলির ট্র্যাক রেখে একটি অ্যারে ব্যবহার করতে পারেন এবং প্রয়োজনে এগুলি বাতিল করতে পারেন।


টিএইচএক্স, আমি একটি ফ্ল্যাগ যুক্ত করেছি কারণ আমি একই সাথে একাধিক অনুরোধ ব্যবহার করেছি
jcho360

এখানে সরল কাজের উদাহরণ: stackoverflow.com/a/42312101/3818394
ধর্মেশ প্যাটেল

আমার ফাংশনে এজাক্স কল রয়েছে আমি কীভাবে এটি বাতিল করতে পারি?
কলারিয়া_এম

যখন একটি এজ্যাক্স কলটি প্রগতিতে চলেছে তখন অন্য কোনও ফাংশন থেকে অ্যাক্সেস করতে ভেরিয়েবলটিকে বিশ্বব্যাপী ঘোষণা করতে হবে। উদাহরণস্বরূপ: একটি বহু-ফাইল আপলোড প্রক্রিয়া।
ক্লেইন ডিসিলভা

180

নীচের স্নিপেট আপনাকে অনুরোধের একটি তালিকা ( পুল ) বজায় রাখতে এবং প্রয়োজনে সেগুলি সবই বাতিল করতে দেয়। অন্য কোনও এএএএক্সএক্স কল করার আগে<HEAD> আপনার এইচটিএমএলতে স্থান দেওয়ার জন্য সেরা।

<script type="text/javascript">
    $(function() {
        $.xhrPool = [];
        $.xhrPool.abortAll = function() {
            $(this).each(function(i, jqXHR) {   //  cycle through list of recorded connection
                jqXHR.abort();  //  aborts connection
                $.xhrPool.splice(i, 1); //  removes from list by index
            });
        }
        $.ajaxSetup({
            beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); }, //  annd connection to list
            complete: function(jqXHR) {
                var i = $.xhrPool.indexOf(jqXHR);   //  get index for current connection completed
                if (i > -1) $.xhrPool.splice(i, 1); //  removes from list by index
            }
        });
    })
</script>

2
@ এমকেমুররে - আইই 8-তে ইনিটালাইজেশন করার সময় আমি কি পেয়েছি Object doesn't support property or method 'indexOf'? আমার সন্দেহ হয় এটি স্ট্যাকওভারফ্লো.com / a / 2608601 / 181971 বা সম্ভবত স্ট্যাকওভারফ্লো . com/a/2608618/181971 এ অদলবদল হতে পারে ?
টিম

3
@ জিআরআর ঠিক বলেছেন, তার উত্তর দেখুন এবং এজ্যাক্সআপের জন্য ডক্সটি পরীক্ষা করুন ।
কেজফবি

@ টিম - স্টিভেনের পরামর্শ অনুসারে, ভার সূচক = $ .xhrPool.indexOf (jqXHR) এর পরিবর্তে; ব্যবহার: var সূচক = $ .inArray (jqXHR, x .xhrPool);
ক্রিস্টোফার

1
@ এমকিউমুরে: এটি টাইপ এরির দেখায়: jqXHR.abort আমার পক্ষে কোনও কাজ নয়। :(
শেশা

সেখানে abortAll পদ্ধতি, যা এই উত্তরটি এখানে সংশোধন করা হয়েছে সামান্য যৌক্তিক ত্রুটি stackoverflow.com/a/45500874/1041341
সারিন জাতীয়

122

এজ্যাক্সেটআপ ব্যবহার করা ঠিক নয় , যেমন এটির ডক পৃষ্ঠায় উল্লেখ করা হয়েছে। এটি কেবল ডিফল্ট সেট আপ করে, এবং যদি কিছু অনুরোধ সেগুলি ওভাররাইড করে তবে সেখানে কোনও গণ্ডগোল হবে।

আমি পার্টিতে দেরিতে আছি, তবে ভবিষ্যতের রেফারেন্সের জন্য যদি কেউ একই সমস্যার সমাধানের সন্ধান করে তবে আমি এখানেই যাচ্ছি, অনুপ্রাণিত হয়ে এবং পূর্বের উত্তরগুলির সাথে অনেকটা অভিন্ন, তবে আরও সম্পূর্ণ

// Automatically cancel unfinished ajax requests 
// when the user navigates elsewhere.
(function($) {
  var xhrPool = [];
  $(document).ajaxSend(function(e, jqXHR, options){
    xhrPool.push(jqXHR);
  });
  $(document).ajaxComplete(function(e, jqXHR, options) {
    xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR});
  });
  var abort = function() {
    $.each(xhrPool, function(idx, jqXHR) {
      jqXHR.abort();
    });
  };

  var oldbeforeunload = window.onbeforeunload;
  window.onbeforeunload = function() {
    var r = oldbeforeunload ? oldbeforeunload() : undefined;
    if (r == undefined) {
      // only cancel requests if there is no prompt to stay on the page
      // if there is a prompt, it will likely give the requests enough time to finish
      abort();
    }
    return r;
  }
})(jQuery);

অন্য ফাংশন থেকে একজন কীভাবে গর্ভপাত () পদ্ধতি কল করে?
স্ট্যান জেমস 21

গর্ভপাত একটি পদ্ধতি নয়, একটি ফাংশন। আপনি এটিকে একই এনক্যাপসুলেশনের মধ্যে থেকে সাধারণত কল করেন, আপনার যদি এনক্যাপসুলেশনের বাইরে এটির প্রয়োজন হয় তবে আপনি ফাংশন নামের আগে "ভার" মুছে ফেলতে পারেন এবং এটি বিশ্বব্যাপী উপলব্ধ ফানসিটনে পরিণত হবে
ট্রে

হাই, কেউ কখন ব্যাখ্যা করতে পারবেন যে আর কখন অপরিজ্ঞাত হবে?
বরুণ

36

আমি বর্তমানে এটি সম্পাদন করতে যা ব্যবহার করছি তা এখানে।

$.xhrPool = [];
$.xhrPool.abortAll = function() {
  _.each(this, function(jqXHR) {
    jqXHR.abort();
  });
};
$.ajaxSetup({
  beforeSend: function(jqXHR) {
    $.xhrPool.push(jqXHR);
  }
});

দ্রষ্টব্য: _.আন্ডারস্কোর.জেগুলির বিভিন্ন উপস্থিত রয়েছে, তবে স্পষ্টতই এটি প্রয়োজনীয় নয়। আমি কেবল অলস এবং আমি এটিকে $ .এচ () এ পরিবর্তন করতে চাই না। 8P


2
আমি একটি সামান্য পরিবর্তিত সমাধান পেয়েছি যা দুর্দান্তভাবে কাজ করে যে আমি পোস্ট করতে চলেছি।
mkmurray

7
এই স্মৃতি ফাঁস। aboutAllঅ্যারে থেকে উপাদানগুলি সরানো উচিত। একটি অনুরোধ শেষ হয়ে গেলে, তালিকা থেকে নিজেকে সরিয়ে নেওয়া উচিত।
বেহরং সাইদজাদেহে

5
@ বেহরংসেইদজাদেহ আপনারও তখন একটি উন্নত সংস্করণ পোস্ট করা উচিত ছিল।
ম্যাটসভেন

19

প্রতিটি এক্সএইচআর অনুরোধটি একটি অনন্য আইডি দিন এবং প্রেরণের আগে কোনও বস্তুতে রেফারেন্সটি সংরক্ষণ করুন। এক্সএইচআর অনুরোধ সম্পূর্ণ হওয়ার পরে রেফারেন্সটি মুছুন।

যে কোনও সময় সমস্ত অনুরোধ বাতিল করতে:

$.ajaxQ.abortAll();

বাতিল হওয়া অনুরোধের অনন্য আইডিকে ফিরিয়ে দেয়। কেবল পরীক্ষার উদ্দেশ্যে।

কার্যকারিতা:

$.ajaxQ = (function(){
  var id = 0, Q = {};

  $(document).ajaxSend(function(e, jqx){
    jqx._id = ++id;
    Q[jqx._id] = jqx;
  });
  $(document).ajaxComplete(function(e, jqx){
    delete Q[jqx._id];
  });

  return {
    abortAll: function(){
      var r = [];
      $.each(Q, function(i, jqx){
        r.push(jqx._id);
        jqx.abort();
      });
      return r;
    }
  };

})();

একক ফাংশন সহ এমন কোনও বস্তু ফেরত দেয় যা প্রয়োজনে আরও কার্যকারিতা যুক্ত করতে ব্যবহৃত হতে পারে।


17

একাধিক অনুরোধের জন্য আমি এটি খুব সহজ পেয়েছি।

পদক্ষেপ 1: পৃষ্ঠার শীর্ষে একটি চলক নির্ধারণ করুন:

  xhrPool = []; // no need to use **var**

পদক্ষেপ 2 : পূর্বে সেট করুন সমস্ত অজ্যাক্স অনুরোধগুলিতে প্রেরণ করুন:

  $.ajax({
   ...
   beforeSend: function (jqXHR, settings) {
        xhrPool.push(jqXHR);
    },
    ...

স্টিপি 3: আপনার প্রয়োজন যেখানেই এটি ব্যবহার করুন:

   $.each(xhrPool, function(idx, jqXHR) {
          jqXHR.abort();
    });

এই স্টেমওভারফ্লো.com/a/6618288/1772379 যেমন ঠিক তেমন কারণেই মেমরি ফাঁস করে দেয়।
বেন জনসন

জাভাস্ক্রিপ্ট লেখার সত্যিই ভয়ঙ্কর উপায়।
ওজিল

1
শেষে আপনি xhrPool অ্যারে সাফ / খালি করতে পারেন
স্পেস আর্থ

6

আমি উপরে mkmurray এবং SpYk3HH উত্তর প্রসারিত করেছি যাতে xhrPool.abortAl প্রদত্ত url এর সমস্ত মুলতুবি থাকা অনুরোধ বাতিল করতে পারে :

$.xhrPool = [];
$.xhrPool.abortAll = function(url) {
    $(this).each(function(i, jqXHR) { //  cycle through list of recorded connection
        console.log('xhrPool.abortAll ' + jqXHR.requestURL);
        if (!url || url === jqXHR.requestURL) {
            jqXHR.abort(); //  aborts connection
            $.xhrPool.splice(i, 1); //  removes from list by index
        }
    });
};
$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR); //  add connection to list
    },
    complete: function(jqXHR) {
        var i = $.xhrPool.indexOf(jqXHR); //  get index for current connection completed
        if (i > -1) $.xhrPool.splice(i, 1); //  removes from list by index
    }
});
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    console.log('ajaxPrefilter ' + options.url);
    jqXHR.requestURL = options.url;
});

AbortAll এখন বিকল্প হিসাবে প্যারামিটার হিসাবে একটি ইউআরএল গ্রহণ করতে পারে এবং কেবলমাত্র সেই ইউআরএলে কেবল মুলতুবি থাকা কলগুলি বাতিল করবে


5

অ্যান্ডির কোড নিয়ে আমার কিছু সমস্যা ছিল তবে এটি আমাকে দুর্দান্ত ধারণা দিয়েছে। প্রথম সমস্যাটি হ'ল আমাদের সফলভাবে সম্পূর্ণ হওয়া কোনও জেএকিএক্সএইচআর অবজেক্টগুলি পপআপ করা উচিত। আমি AbortAl ফাংশনটিও পরিবর্তন করতে হয়েছিল। এখানে আমার চূড়ান্ত কার্য কোড:

$.xhrPool = [];
$.xhrPool.abortAll = function() {
            $(this).each(function(idx, jqXHR) {
                        jqXHR.abort();
                        });
};
$.ajaxSetup({
    beforeSend: function(jqXHR) {
            $.xhrPool.push(jqXHR);
            }
});
$(document).ajaxComplete(function() {
            $.xhrPool.pop();
            });

আমি কাজগুলি করার এজ্যাক্স কমপ্লিট () পদ্ধতি পছন্দ করি না। আমি কীভাবে .ajaxSetup কনফিগার করার চেষ্টা করেছি তা কার্যকর হয়নি।


7
আমি মনে করি যদি তারা কোনও নির্দিষ্ট ক্রমে পূর্ণ না হয় তবে আপনি হয়ত ভুল অনুরোধে পপ কল করছেন?
jjmontes

1
হ্যাঁ, আপনি পপের পরিবর্তে স্লাইস করতে চান। আমি কিছুটা পরিবর্তিত সমাধান পেয়েছি যা আমি পোস্ট করতে চলেছি।
mkmurray

4

কোডটি আমার পক্ষে কাজ করে দেওয়ার জন্য আপডেট করেছি

$.xhrPool = [];
$.xhrPool.abortAll = function() {
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $(this).each(function(idx, jqXHR) {
        var index = $.inArray(jqXHR, $.xhrPool);
        if (index > -1) {
            $.xhrPool.splice(index, 1);
        }
    });
};

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR);
    },
    complete: function(jqXHR) {
        var index = $.inArray(jqXHR, $.xhrPool);
        if (index > -1) {
            $.xhrPool.splice(index, 1);
        }
    }
});

4

আমার টুপিটি ভিতরে ingুকছে the অ্যারের বিরুদ্ধে অফার abortএবং removeপদ্ধতিগুলি xhrPool, এবং ajaxSetupওভাররাইডগুলি নিয়ে প্রবণ নয় ।

/**
 * Ajax Request Pool
 * 
 * @author Oliver Nassar <onassar@gmail.com>
 * @see    http://stackoverflow.com/questions/1802936/stop-all-active-ajax-requests-in-jquery
 */
jQuery.xhrPool = [];

/**
 * jQuery.xhrPool.abortAll
 * 
 * Retrieves all the outbound requests from the array (since the array is going
 * to be modified as requests are aborted), and then loops over each of them to
 * perform the abortion. Doing so will trigger the ajaxComplete event against
 * the document, which will remove the request from the pool-array.
 * 
 * @access public
 * @return void
 */
jQuery.xhrPool.abortAll = function() {
    var requests = [];
    for (var index in this) {
        if (isFinite(index) === true) {
            requests.push(this[index]);
        }
    }
    for (index in requests) {
        requests[index].abort();
    }
};

/**
 * jQuery.xhrPool.remove
 * 
 * Loops over the requests, removes it once (and if) found, and then breaks out
 * of the loop (since nothing else to do).
 * 
 * @access public
 * @param  Object jqXHR
 * @return void
 */
jQuery.xhrPool.remove = function(jqXHR) {
    for (var index in this) {
        if (this[index] === jqXHR) {
            jQuery.xhrPool.splice(index, 1);
            break;
        }
    }
};

/**
 * Below events are attached to the document rather than defined the ajaxSetup
 * to prevent possibly being overridden elsewhere (presumably by accident).
 */
$(document).ajaxSend(function(event, jqXHR, options) {
    jQuery.xhrPool.push(jqXHR);
});
$(document).ajaxComplete(function(event, jqXHR, options) {
    jQuery.xhrPool.remove(jqXHR);
});

2

সমস্ত এজাক্স অনুরোধের একটি পুল তৈরি করুন এবং তাদের বাতিল করুন .....

var xhrQueue = []; 

$(document).ajaxSend(function(event,jqxhr,settings){
    xhrQueue.push(jqxhr); //alert(settings.url);
});

$(document).ajaxComplete(function(event,jqxhr,settings){
    var i;   
    if((i=$.inArray(jqxhr,xhrQueue)) > -1){
        xhrQueue.splice(i,1); //alert("C:"+settings.url);
    }
});

ajaxAbort = function (){  //alert("abortStart");
    var i=0;
    while(xhrQueue.length){ 
        xhrQueue[i++] .abort(); //alert(i+":"+xhrQueue[i++]);
    }
};

1

স্বাধীন কোড ব্যবহার করা আরও ভাল .....

var xhrQueue = []; 

$(document).ajaxSend(function(event,jqxhr,settings){
    xhrQueue.push(jqxhr); //alert(settings.url);
});

$(document).ajaxComplete(function(event,jqxhr,settings){
    var i;   
    if((i=$.inArray(jqxhr,xhrQueue)) > -1){
        xhrQueue.splice(i,1); //alert("C:"+settings.url);
    }
});

ajaxAbort = function (){  //alert("abortStart");
    var i=0;
    while(xhrQueue.length){ 
        xhrQueue[i++] .abort(); //alert(i+":"+xhrQueue[i++]);
    }
};

0

যেমনটি গুরুত্বপূর্ণ: বলুন আপনি লগ-অফ করতে চান এবং আপনি টাইমারগুলির সাথে নতুন অনুরোধ উত্পন্ন করছেন: কারণ প্রতিটি নতুন বুটস্ট্র্যাপের সাথে সেশন ডেটাটি পুনর্নবীকরণ করা হয়েছে (সম্ভবত আপনি বলতে পারেন যে আমি দ্রুপাল কথা বলছি, তবে এটি কোনও সাইট যা সেশন ব্যবহার করে) হতে পারে .. আমাকে আমার সমস্ত স্ক্রিপ্টগুলির মধ্যে একটি অনুসন্ধান এবং প্রতিস্থাপন করতে হয়েছিল, কারণ বিভিন্ন ক্ষেত্রে আমার প্রচুর পরিমাণে জিনিস চলছিল: শীর্ষে বৈশ্বিক চলক:

var ajReq = [];
var canAj = true;
function abort_all(){
 for(x in ajReq){
    ajReq[x].abort();
    ajReq.splice(x, 1)
 }
 canAj = false;
}
function rmvReq(ranNum){
 var temp = [];
 var i = 0;
 for(x in ajReq){
    if(x == ranNum){
     ajReq[x].abort();
     ajReq.splice(x, 1);
    }
    i++;
 }
}
function randReqIndx(){
 if(!canAj){ return 0; }
 return Math.random()*1000;
}
function getReqIndx(){
 var ranNum;
 if(ajReq.length){
    while(!ranNum){
     ranNum = randReqIndx();
     for(x in ajReq){
    if(x===ranNum){
     ranNum = null;
    }
     }
    }
    return ranMum;
 }
 return randReqIndx();
}
$(document).ready(function(){
 $("a").each(function(){
    if($(this).attr('href').indexOf('/logout')!=-1){          
     $(this).click(function(){
    abort_all();                 
     });
    }
 })
});
// Then in all of my scripts I wrapped my ajax calls... If anyone has a suggestion for a 
    // global way to do this, please post
var reqIndx = getReqIndx();
if(reqIndx!=0){
ajReq[reqIndx] = $.post(ajax, { 'action': 'update_quantities', iids:iidstr, qtys:qtystr },  
function(data){
 //..do stuff
 rmvReq(reqIndx);
 },'json');
}

0
var Request = {
    List: [],
    AbortAll: function () {
        var _self = this;
        $.each(_self.List, (i, v) => {
            v.abort();
        });
    }
}
var settings = {
    "url": "http://localhost",
    success: function (resp) {
        console.log(resp)
    }
}

Request.List.push($.ajax(settings));

আপনি যখনই সমস্ত এজাক্স অনুরোধ বাতিল করতে চান, আপনার কেবল এই লাইনে কল করতে হবে

Request.AbortAll()

-2

একটি অজানা সমাধান আছে যা আমি এটি সমস্ত এজ্যাক্স অনুরোধ বাতিল করতে ব্যবহার করি। এই সমাধানটি পুরো পৃষ্ঠাটি পুনরায় লোড করা হয়েছে। আপনি যদি প্রতিটি এজাক্স অনুরোধের জন্য কোনও আইডি নির্ধারণ করতে পছন্দ না করেন এবং যদি আপনি লজ-এর জন্য এজাক্স অনুরোধ করেন তবে এই সমাধানটি ভাল। এটি নিশ্চিত করবে যে সমস্ত এজাক্স অনুরোধ নিহত হয়েছে।

location.reload();

-3

যে কোনও ক্লিকে এটি কীভাবে হুক করা যায় তা এখানে রয়েছে (যদি আপনার পৃষ্ঠাটিতে অনেক এজেএক্স কল করা হয় এবং আপনি নেভিগেট করার চেষ্টা করছেন তবে দরকারী)।

$ ->
    $.xhrPool = [];

$(document).ajaxSend (e, jqXHR, options) ->
    $.xhrPool.push(jqXHR)

$(document).ajaxComplete (e, jqXHR, options) ->
    $.xhrPool = $.grep($.xhrPool, (x) -> return x != jqXHR);

$(document).delegate 'a', 'click', ->
    while (request = $.xhrPool.pop())
      request.abort()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.