Atšaukti „Ajax“ užklausas su „jQuery“

Naudodamiesi „jQuery“, kaip galiu atšaukti ar nutraukti „Ajax“ užklausą , kurios dar negavau?

1634
15 янв. rinkinys lukewm 15 sausis 2009-01-15 15:45 '09 15:45 2009-01-15 15:45
@ 19 atsakymų

Dauguma „jQuery Ajax“ metodų grąžina XMLHttpRequest objektą (arba lygiavertį), todėl galite tiesiog naudoti abort() .

Žr. Dokumentaciją:

 var xhr = $.ajax({ type: "POST", url: "some.php", data: "name=John success: function(msg){ alert( "Data Saved: " + msg ); } }); //kill the request xhr.abort() 

UPDATE: Naudojant jQuery 1.5, grąžinamas objektas yra savo XMLHttpRequest objekto pakuotė, vadinama jqXHR. Atrodo, kad šis objektas atskleidžia visas savo savybes ir metodus, todėl aukščiau pateiktas pavyzdys vis dar veikia. Žr JqXHR objektas (jQuery API dokumentas).

Atnaujinimas 2: Nuo „jQuery 3“, „ajax“ metodas dabar grąžina pažadą su papildomais metodais (pvz., Pertrauka), todėl aukščiau nurodytas kodas vis dar veikia, nors grąžinamas objektas nebėra xhr . Žr. Tinklaraštį 3.0 čia .

UPDATE 3 : xhr.abort() vis dar veikia su jQuery 3.x. Negalima manyti, kad 2 atnaujinimas yra teisingas. Sužinokite daugiau apie „jQuery Github“ saugyklą .

1593
15 янв. atsakymas yra duotas m. sausio 15 d 2009-01-15 15:56 '09 15:56 2009-01-15 15:56

Negalite prisiminti užklausos, tačiau galite nustatyti laiko trukmės vertę, po kurios atsakymas bus ignoruojamas. Žr. Šį puslapį, skirtą jQuery AJAX parametrams. Manau, kad jūsų atšaukimas bus iškviestas, jei viršijamas laukimo laikotarpis. Numatytasis laikas yra nustatytas kiekvienam AJAX prašymui.

Taip pat galite naudoti užklausos objekto nutraukimo () metodą, tačiau nors dėl to klientas nustoja klausytis įvykio, jis negali sustabdyti serverio apdorojimo.

106
15 янв. Atsakymą pateikė tvanfosson sausio 15 d 2009-01-15 15:55 '09, 15:55, 2009-01-15 15:55

Šis prašymas yra asinchroninis , o tai reiškia, kad jis jį išsiuntė.

Jei jūsų serveris pradeda labai brangią operaciją dėl AJAX užklausos, geriausias dalykas, kurį galite padaryti, yra atidaryti serverį, kad galėtumėte klausytis atšaukimo užklausų ir siųsti atskirą AJAX užklausą, informuodami serverį, kad sustabdytų viską, ką jis daro.

Priešingu atveju tiesiog ignoruokite AJAX atsakymą.

70
15 янв. Atsakymas, kurį pateikė Yuval Adam Jan 15 2009-01-15 15:56 '09 15:56 2009-01-15 15:56

Išsaugokite skambučius, kuriuos padarote matricoje, tada paskambinkite xhr.abort () kiekvienam.

UŽTIKRINIMAS: galite nutraukti užklausą, tačiau tai tik kliento pusė. Serverio pusė vis dar gali apdoroti užklausą. Jei naudojate kažką panašaus į PHP arba ASP su seanso duomenimis, sesijos duomenys užblokuojami, kol bus baigtas. Taigi, norint, kad vartotojas galėtų toliau naršyti svetainę, turite skambinti session_write_close (). Tai išsaugo seansą ir atlaisvina jį, kad tęstų kitus puslapius, laukiančius tęsti. Be to, keli puslapiai gali tikėtis, kad užraktas bus pašalintas.

62
28 марта '12 в 14:34 2012-03-28 14:34 atsakymą pateikė Tei kovo 28 d., 12 val. 14:34 2012-03-28 14:34

AJAX užklausos negali būti vykdomos tokia tvarka, kuria jos buvo paleistos. Užuot nutraukę, galite ignoruoti visus AJAX atsakymus, išskyrus paskutinius:

  • Sukurti skaitiklį
  • Padidinkite skaitiklį paleidžiant AJAX užklausą
  • Naudokite užklausos „antspaudas“ dabartinę skaitiklių vertę
  • Sėkmės atšaukimo metu palyginkite antspaudą su skaitiklis, kad pamatytumėte, ar tai buvo paskutinis prašymas.

Grubaus kodo schema:

 var xhrCount = 0; function sendXHR() { // sequence number for the current invocation of function var seqNumber = ++xhrCount; $.post("/echo/json/", { delay: Math.floor(Math.random() * 5) }, function() { // this works because of the way closures work if (seqNumber === xhrCount) { console.log("Process the response"); } else { console.log("Ignore the response"); } }); } sendXHR(); sendXHR(); sendXHR(); // AJAX requests complete in any order but only the last // one will trigger "Process the response" message 

„JsFiddle“ demonstracija

45
18 янв. Atsakymą pateikė Salman A sausio 18 d. 2014-01-18 15:55 '14, 15:55 2014-01-18 15:55

Mums tereikia išspręsti šią problemą ir išbandyti tris skirtingus metodus.

  • panaikina @meouw pasiūlytą prašymą
  • užpildykite visą užklausą, bet apdoroja tik paskutinio išsiuntimo rezultatus
  • neleidžia naujų užklausų, kol kitas įvykdomas

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input id="button" type="button" value="click" /> 

Mūsų atveju nusprendėme naudoti # 3 metodą, nes jis sukuria mažiau apkrovos serveriui. Bet aš nežinau, ar jQuery garantuoja skambutį į .complete () metodą, o tai gali sukelti aklavietę. Mūsų bandymuose mes negalėjome atkurti šios situacijos.

36
06 марта '13 в 17:29 2013-03-06 17:29 atsakymas pateikiamas oyophant kovo 6 d. 13 val. 17:29 2013-03-06 17:29

Visada geriau daryti kažką panašaus.

 var $request; if ($request != null){ $request.abort(); $request = null; } $request = $.ajax({ type : "POST", //TODO: Must be changed to POST url : "yourfile.php", data : "data" }).done(function(msg) { alert(msg); }); 

Tačiau daug geriau, jei patikrinsite, ar pareiškimas yra patikrintas, ar „ajax“ prašymas yra nulis, ar ne.

30
15 окт. Tharindu Kumara atsakymas spalio 15 d 2014-10-15 12:14 '14, 12:14 2014-10-15 12:14

„meouw“ sprendimas yra teisingas, tačiau jei domitės didesne kontrole, galite išbandyti „ Ajax Manager“ papildinį „jQuery“.

19
15 янв. Prestaul atsakymas, sausio 15 d 2009-01-15 18:45 '09 18:45 2009-01-15 18:45

Ieškojau realiu laiku ir paprašiau atšaukti laukiančius prašymus, kurie galėjo užtrukti ilgiau nei paskutinis / naujausias prašymas.

Mano atveju naudoju kažką panašaus:

 //On document ready var ajax_inprocess = false; $(document).ajaxStart(function() { ajax_inprocess = true; }); $(document).ajaxStop(function() { ajax_inprocess = false; }); //Snippet from live search function if (ajax_inprocess == true) { request.abort(); } //Call for new request 
11
04 дек. Atsakymas duotas Billy 04 Dec. 2013-12-04 17:43 '13, 17:43, 2013-12-04 17:43

Kadangi daugelis sraute sako, tik dėl to, kad kliento pusėje užklausa nutraukiama, serveris vis tiek apdoros užklausą. Tai sukuria nereikalingą apkrovą serveriui, nes atlieka darbą, kurį nustojome klausytis sąsajoje.

Problema, kurią bandžiau išspręsti (kiti gali ją įvesti), yra tai, kad kai vartotojas įvedė informaciją į įvesties lauką, norėjau, kad aš paprašiau jūsų pateikti užklausą dėl momentinio „Google Instant“ tipo.

Kad išvengtumėte nereikalingų užklausų ir laikytumėtės priekinės dalies, aš padariau:

 var xhrQueue = []; var xhrCount = 0; $('#search_q').keyup(function(){ xhrQueue.push(xhrCount); setTimeout(function(){ xhrCount = ++xhrCount; if (xhrCount === xhrQueue.length) { // Fire Your XHR // } }, 150); }); 

Tai iš esmės siunčia vieną užklausą kas 150 ms (kintamasis, kurį galite pritaikyti pagal savo poreikius). Jei turite problemų suprasti, kas čia vyksta, parašykite xhrCount ir xhrQueue į konsolę prieš pat bloką.

10
03 февр. atsakymas duotas brianrhea 03 vasaris 2014-02-03 21:43 '14 ne 21:43 2014-02-03 21:43

Tiesiog skambinkite xhr. abortas () yra „jquery ajax“ objektas arba vietinis XMLHTTPRequest objektas.

pavyzdys:

 //jQuery ajax $(document).ready(function(){ var xhr = $.get('/server'); setTimeout(function(){xhr.abort();}, 2000); }); //native XMLHTTPRequest var xhr = new XMLHttpRequest(); xhr.open('GET','/server',true); xhr.send(); setTimeout(function(){xhr.abort();}, 2000); 
9
28 мая '15 в 12:17 2015-05-28 12:17 atsakymas pateikiamas cuixiping gegužės 15 d., 15 val. 12:17 2015-05-28 12:17

nėra patikimo būdo tai padaryti, ir aš netgi neišbandysiu, kai tik bus pateiktas prašymas; vienintelis būdas protingai reaguoti yra ignoruoti atsakymą.

Daugeliu atvejų tai gali atsitikti tokiose situacijose, kaip: vartotojas paspaudžia mygtuką ant mygtuko, kuris pernelyg dažnai paleidžia daugelį XHRs, čia jūs turite daug galimybių, arba užrakinkite mygtuką, kol XHR sugrįš, ar net naujas XHR. ir kiti kūriniai, nurodydami, kad vartotojas atsilieka - arba atšaukia laukiamą XHR atsakymą, bet neseniai.

8
17 июня '15 в 21:44 2015-06-17 21:44 atsakymas pateikiamas ateisGetSome birželio 17 d. 15, 21:44 2015-06-17 21:44

Pavyzdžiui, naudokite ajax.abort (), pavyzdžiui, galite nutraukti bet kokį laukiančią „ajax“ užklausą prieš siųsdami kitą

 //check for existing ajax request if(ajax){ ajax.abort(); } //then you make another ajax request $.ajax( //your code here ); 
8
08 нояб. Atsakyti Joecoder001 08 Nov. 2013-11-08 11:07 '13, 11:07, 2013-11-08 11:07

Turėjau apklausos problemą ir, kai puslapis buvo uždarytas, apklausa tęsėsi, todėl, mano nuomone, vartotojas praleido atnaujinimą, nes mysql reikšmė buvo nustatyta per ateinančias 50 sekundžių po to, kai puslapis buvo uždarytas, nors aš nužudiau „ajax“ prašymą, supratau, kad naudoju $ _SESSION diegimui „var“ nebus atnaujintas apklausoje, kol jis nesibaigs, o naujasis neprasideda, todėl savo duomenų bazėje padariau vertę kaip 0 = offpage, o aš apklausiu, prašau šios eilutės ir grąžina klaidingą; kai apklausoje yra 0, jūs gaunate dabartines vertes, žinoma ...

Tikiuosi, kad tai padėjo.

4
25 июля '13 в 15:44 2013-07-25 15:44 atsakymas duotas Marcusui liepos 25 d. 13:44 2013-07-25 15:44

Šis kodas rodo „Ajax“ užklausos inicijavimą ir nutraukimą:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type="button" class="go" value="GO!" > <input type="button" class="stop" value="STOP!" > 
4
04 янв. atsakymas yra duotas 04 sausio. 2016-01-04 16:35 '16, 16:35 pm 2016-01-04 16:35

Aš bendrinau demonstraciją , parodančią, kaip atšaukti AJAX užklausą - jei duomenys iš serverio negrąžinami per iš anksto nustatytą laiką.

HTML:

 <div id="info"></div> 

JS KODAS:

 var isDataReceived= false, waitTime= 1000; $(function() { // Ajax request sent. var xhr= $.ajax({ url: 'http://api.joind.in/v2.1/talks/10889', data: { format: 'json' }, dataType: 'jsonp', success: function(data) { isDataReceived= true; $('#info').text(data.talks[0].talk_title); }, type: 'GET' }); // Cancel ajax request if data is not loaded within 1sec. setTimeout(function(){ if(!isDataReceived) xhr.abort(); },waitTime); }); 
2
12 февр. Atsakymą davė ganesh , vasario 12 d. 2016-02-12 08:25 '16 at 8:25 am 2016-02-12 08:25

Jei xhr.abort(); sukelia puslapį įkelti iš naujo

Tada galite nustatyti onreadystatechange prieš nutraukdami, kad:

 // ↓ prevent page reload by abort() xhr.onreadystatechange = null; // ↓ may cause page reload xhr.abort(); 
2
23 окт. atsakymas pateikiamas vikyd 23 okt. 2016-10-23 14:56 '16 at 14:56 pm 2016-10-23 14:56

Naudodami šią funkciją, galite nutraukti bet kokį nepertraukiamąjį skambutį

 <input id="searchbox" name="searchbox" type="text" /> <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> <script type="text/javascript"> var request = null; $('#searchbox').keyup(function () { var id = $(this).val(); request = $.ajax({ type: "POST", //TODO: Must be changed to POST url: "index.php", data: {'id':id}, success: function () { }, beforeSend: function () { if (request !== null) { request.abort(); } } }); }); </script> 
1
18 мая '18 в 16:17 2018-05-18 16:17 atsakė Soubhagya Kumarui gegužės 18 d. 18 val. 16:17 val
 $.ajax({ type: "POST", url: "handlername", data: "paramerers", success: function(msg){ alert( "Result: " + msg ); }, error: function() { alert("Error Message"); }, datatype : JSON, async: false, cache: false }); 
-6
03 дек. Atsakymą pateikė Rohit Chidrewar 03 dec. 2017-12-03 01:20 '17 at 1:20 2017-12-03 01:20

Kiti klausimai apie „ etiketes arba užduoti klausimą