दिलचस्प पोस्ट
क्यों ब्राउज़र अभी भी HTML5 में <tobody> इंजेक्ट करते हैं? जावा एसोसिएटिव- सरणी ReactJS: घटक प्रारंभिक राज्य क्यों एक विरोधी पैटर्न प्रतिद्वंद्वी गुजर रहा है? HTML पृष्ठ में निर्देशिका चुनने वाला जब आपका ऐप खुला होता है और अग्रभूमि में स्टॉक आईओएस अधिसूचना बैनर प्रदर्शित करता है? कोण 4 में HTTP और HTTPClient के बीच का अंतर? जावा में एक अर्रे को पुनरावृति करने का सबसे तेज़ तरीका: बयान के लिए बढ़ाया गया पाश चर बनाम पायथन में वर्तमान मॉड्यूल के भीतर मैं सभी वर्गों की एक सूची कैसे प्राप्त करूं? सी ++: क्या सूचक को वापस करने के लिए पॉइंटर डालने और बाद में वापस पॉइंटर पर सुरक्षित है? संपत्ति के नाम से जावास्क्रिप्ट ऑब्जेक्ट को छांटें नकारात्मक संख्याओं के साथ मॉड्यूलो ऑपरेशन पायथन में कोशिश-छोड़कर-दूसरे का उपयोग करने के लिए क्या यह एक अच्छा अभ्यास है? किसी विशिष्ट प्रकार (बटन / टेक्स्टबॉक्स) के किसी भी विंडोज फॉर्म के सभी बच्चे नियंत्रण कैसे प्राप्त करें? कंटेंट डिलीवरी नेटवर्क (सीडीएन) का उपयोग करने के फायदे और नुकसान क्या हैं? पेंथर को Wampserver के साथ कैसे स्थापित करें

JQuery.queue () का उपयोग कर AJAX अनुरोधों को कतार दें

मैं पहली बार jQuery.queue () का उपयोग कर रहा हूं और इसे काफी समझा नहीं है। क्या कोई मुझे बताता है कि मैं क्या कर रहा हूं गलत है?

फायरबग की तलाश में मैं अभी भी अपने पोस्ट अनुरोधों को एक ही समय में देख रहा हूं – इसलिए मैं सोच रहा हूं कि मैं गलत जगह पर dequeue () को फोन कर रहा हूं।

इसके अलावा – मैं कतार की लंबाई कैसे प्राप्त करूं?

मुझे इन अनुरोधों को पंक्तिबद्ध करने की आवश्यकता है कि यह एक बटन के क्लिक पर निकाल दिया जाता है और इसके तुरंत उपयोगकर्ता के लिए त्वरित उत्तराधिकार में कई बटन क्लिक करने के लिए

मेरे कोड की बुनियादी संरचना को छीनने की कोशिश की:

$("a.button").click(function(){ $(this).doAjax(params); }); // method doAjax:function(params){ $(document).queue("myQueueName", function(){ $.ajax({ type: 'POST', url: 'whatever.html', params: params, success: function(data){ doStuff; $(document).dequeue("myQueueName"); } }); }); } 

वेब के समाधान से एकत्रित समाधान "JQuery.queue () का उपयोग कर AJAX अनुरोधों को कतार दें"

आप यहां समस्या है, कि .ajax() एक एसिंक्रोनस चल रहे अजाक्स अनुरोध को आग लगाती है। इसका अर्थ है, .ajax() तत्काल रिटर्न, गैर-अवरुद्ध। तो आपकी कतार फ़ंक्शंस लेकिन वे लगभग उसी समय आग लगेंगे जैसे आप वर्णित हैं।

मुझे नहीं लगता कि। .queue() में .queue() अनुरोध करने के लिए एक अच्छी जगह है, यह fx methods के उपयोग के लिए अधिक है। आपको एक सरल प्रबंधक की आवश्यकता है

 var ajaxManager = (function() { var requests = []; return { addReq: function(opt) { requests.push(opt); }, removeReq: function(opt) { if( $.inArray(opt, requests) > -1 ) requests.splice($.inArray(opt, requests), 1); }, run: function() { var self = this, oriSuc; if( requests.length ) { oriSuc = requests[0].complete; requests[0].complete = function() { if( typeof(oriSuc) === 'function' ) oriSuc(); requests.shift(); self.run.apply(self, []); }; $.ajax(requests[0]); } else { self.tid = setTimeout(function() { self.run.apply(self, []); }, 1000); } }, stop: function() { requests = []; clearTimeout(this.tid); } }; }()); 

यह सही होने से बहुत दूर है, मैं बस जाने का रास्ता दिखाना चाहता हूं। ऊपर दिए गए उदाहरण का इस्तेमाल किसी तरह से किया जा सकता है

 $(function() { ajaxManager.run(); $("a.button").click(function(){ ajaxManager.addReq({ type: 'POST', url: 'whatever.html', data: params, success: function(data){ // do stuff } }); }); }); 

मुझे ऐसा ही एक काम करने की ज़रूरत थी, सोचा कि मैं यहां अपना समाधान पोस्ट करूँगा।

असल में मुझे जो मिला है वह एक पृष्ठ है, जो उन अलमारियों पर परियोजनाओं को सूचीबद्ध करता है जिनमें सभी विशिष्ट मापदंड हैं। मैं उपयोगकर्ता को कुछ सामग्री प्राप्त करने के लिए पूरी तरह से अलमारियों को एक से एक के बजाय एक से एक बार लोड करना चाहता था, जिससे वे आराम से लोड करते हुए देख सकते थे।

असल में मैं जेएस सरणी में प्रत्येक शेल्फ की आईडी को संग्रहीत करता हूं जो उन्हें PHP से कॉल करते समय उपयोग करता है।

मैंने फिर से एक पुनरावर्ती समारोह बनाया, जो हर बार उसे बुलाया जाता है और पॉपेड आईडी के शेल्फ का अनुरोध करता है। एक बार जब मुझे $.get() या $.post() से प्रतिसाद $.get() तो मैं जो भी इस्तेमाल करना पसंद करता हूं, फिर मैं कॉलबैक के भीतर से रिकर्सिव फ़ंक्शन को कॉल करता हूं।

यहां कोड में एक विस्तार है:

 // array of shelf IDs var shelves = new Array(1,2,3,4); // the recursive function function getShelfRecursive() { // terminate if array exhausted if (shelves.length === 0) return; // pop top value var id = shelves[0]; shelves.shift(); // ajax request $.get('/get/shelf/' + id, function(){ // call completed - so start next request getShelfRecursive(); }); } // fires off the first call getShelfRecursive(); 

मुझे अजाक्स कॉल की एक अज्ञात संख्या के लिए ऐसा करने की आवश्यकता थी। इसका उत्तर था कि प्रत्येक को एक सरणी में धकेल दिया जाए और फिर इसका उपयोग करें:

 $.when.apply($, arrayOfDeferreds).done(function () { alert("All done"); }); 

मुझे ऊपर दिए गए समाधान जटिल प्रकार मिलते हैं, प्लस मुझे भेजने से पहले एक नया डेटा टोकन अपडेट करने के लिए अनुरोध को बदलने की आवश्यकता थी।

इसलिए मैंने इसे एक साथ रखा। स्रोत: https://gist.github.com/2470554

 /* Allows for ajax requests to be run synchronously in a queue Usage:: var queue = new $.AjaxQueue(); queue.add({ url: 'url', complete: function() { console.log('ajax completed'); }, _run: function(req) { //special pre-processor to alter the request just before it is finally executed in the queue req.url = 'changed_url' } }); */ $.AjaxQueue = function() { this.reqs = []; this.requesting = false; }; $.AjaxQueue.prototype = { add: function(req) { this.reqs.push(req); this.next(); }, next: function() { if (this.reqs.length == 0) return; if (this.requesting == true) return; var req = this.reqs.splice(0, 1)[0]; var complete = req.complete; var self = this; if (req._run) req._run(req); req.complete = function() { if (complete) complete.apply(this, arguments); self.requesting = false; self.next(); } this.requesting = true; $.ajax(req); } }; 

मैं एजेक्स कॉल्स को एक-दूसरे के "अधिक से ज्यादा" से रखने के लिए यह बहुत सरल कोड का उपयोग करता हूं

 var dopostqueue = $({}); function doPost(string, callback) { dopostqueue.queue(function() { $.ajax( { type: 'POST', url: 'thephpfile.php', datatype: 'json', data: string, success:function(result) { dopostqueue.dequeue(); callback(JSON.parse(result)); } }) }); } 

यदि आप कतार को खुद को संभालने के लिए नहीं चाहते हैं, तो आप फ़ंक्शन से dequeue को हटा सकते हैं और इसे किसी अन्य फ़ंक्शन से कॉल कर सकते हैं। कतार लंबाई प्राप्त करने के लिए, इस उदाहरण के लिए यह होगा:

 dopostqueue.queue().length 

टाइमर के बिना जे एंड के जवाब का एक और संस्करण।

 var ajaxManager = { requests: [], addReq: function(opt) { this.requests.push(opt); if (this.requests.length == 1) { this.run(); } }, removeReq: function(opt) { if($.inArray(opt, requests) > -1) this.requests.splice($.inArray(opt, requests), 1); }, run: function() { // original complete callback oricomplete = this.requests[0].complete; // override complete callback var ajxmgr = this; ajxmgr.requests[0].complete = function() { if (typeof oricomplete === 'function') oricomplete(); ajxmgr.requests.shift(); if (ajxmgr.requests.length > 0) { ajxmgr.run(); } }; $.ajax(this.requests[0]); }, stop: function() { this.requests = []; }, } 

उपयोग करने के लिए:

 $(function() { $("a.button").click(function(){ ajaxManager.addReq({ type: 'POST', url: 'whatever.html', data: params, success: function(data){ // do stuff } }); }); }); 

Learn.jquery.com वेबसाइट का भी एक अच्छा उदाहरण है :

 // jQuery on an empty object, we are going to use this as our queue var ajaxQueue = $({}); $.ajaxQueue = function(ajaxOpts) { // Hold the original complete function var oldComplete = ajaxOpts.complete; // Queue our ajax request ajaxQueue.queue(function(next) { // Create a complete callback to invoke the next event in the queue ajaxOpts.complete = function() { // Invoke the original complete if it was there if (oldComplete) { oldComplete.apply(this, arguments); } // Run the next query in the queue next(); }; // Run the query $.ajax(ajaxOpts); }); }; // Get each item we want to copy $("#items li").each(function(idx) { // Queue up an ajax request $.ajaxQueue({ url: "/ajax_html_echo/", data: { html: "[" + idx + "] " + $(this).html() }, type: "POST", success: function(data) { // Write to #output $("#output").append($("<li>", { html: data })); } }); }); 

आप jQuery का विस्तार कर सकते हैं:

 (function($) { // Empty object, we are going to use this as our Queue var ajaxQueue = $({}); $.ajaxQueue = function(ajaxOpts) { // hold the original complete function var oldComplete = ajaxOpts.complete; // queue our ajax request ajaxQueue.queue(function(next) { // create a complete callback to fire the next event in the queue ajaxOpts.complete = function() { // fire the original complete if it was there if (oldComplete) oldComplete.apply(this, arguments); next(); // run the next query in the queue }; // run the query $.ajax(ajaxOpts); }); }; })(jQuery); 

तो इसे पसंद करें:

 $.ajaxQueue({ url: 'doThisFirst.php', async: true, success: function (data) { //success handler }, error: function (jqXHR,textStatus,errorThrown) { //error Handler } }); $.ajaxQueue({ url: 'doThisSecond.php', async: true, success: function (data) { //success handler }, error: function (jqXHR,textStatus,errorThrown) { //error Handler } }); 

निश्चित रूप से आप $ .ajax विकल्पों में से किसी भी प्रकार, डेटा, कंटेंटटाइप, डेटाटाइप जैसे का उपयोग कर सकते हैं क्योंकि हम $।

मुझे यह एक समाधान के भीतर भी करना पड़ा और मैंने पाया कि मैं इसे इस तरह से कर सकता हूं:

 //A variable for making sure to wait for multiple clicks before emptying. var waitingTimeout; $("a.button").click(function(){ $(this).doAjax(params); clearTimeout(waitingTimeout); waitingTimeout = setTimeout(function(){noMoreClicks();},1000); }); // method doAjax:function(params){ $(document).queue("myQueueName", function(next){ $.ajax({ type: 'POST', url: 'whatever.html', data: params, contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){ doStuff; next(); }, failure: function(data){ next(); }, error: function(data){ next(); } }); }); } function noMoreClicks(){ $(document).dequeue("myQueueName"); } 

next() कॉलबैक का उपयोग करके जो कतार फ़ंक्शन में पारित हो जाता है, आप अगले ऑपरेशन को रद्द कर सकते हैं। अजाक्स के लिए हैंडलर्स में अगले को डालकर, आप प्रभावी रूप से एजेक्स को ब्राउज़र के लिए एसिंक्रोनस कॉल और ब्राउज़र के रेंडर या पेंट थ्रेड को बनाते हैं, लेकिन उन्हें एक-दूसरे को सिंक्रोनस या सीरियल कर दिया जाता है

यहां एक बहुत ही बुनियादी उदाहरण है। उदाहरण के बेसल में एक बार बटन पर क्लिक करें और एक सेकंड प्रतीक्षा करें आप देखेंगे कि समय ट्रिगर होता है और एकल ऑपरेशन होता है। अगले बटन को जितनी जल्दी हो सके (या एक सेकंड से ज़्यादा) क्लिक करें और आप देखेंगे कि हर बार जब आप बटन पर क्लिक करते हैं, तो आपरेशन कतारबद्ध होते हैं और फिर एक दूसरे के इंतजार के बाद ही वे पृष्ठ को दबाते हैं और एक के बाद बाद में फीका अन्य।

इस की सुंदरता यह है कि यदि कतार पहले से ही खाली हो रहा है, तो जब भी खाली हो रहा है, आप किसी भी परिचालन को जोड़ते हैं, अंत में रखे जाते हैं, और तब बस प्रक्रिया होती है जब समय आता है।

यह मेरा समाधान है, जिसका उपयोग मैं कुछ ब्राउजरगार्म के लिए अनुरोधों की कतार का उत्पादन करने के लिए करता हूं। अगर कुछ भी होता है तो मैं इस कतार को बंद कर देता हूं और कुछ विशेष अंतिम अनुरोध या सफाई के साथ काम खत्म कर देता हूं।

 var get_array = ["first", "second", "third"]; var worker = $("<div />"); // to line up requests in queue $.queuedAjax = function(args){ // add up requests for me worker.queue( function(next){ $.ajax(args).always(next); } ); }; $.queuedSomething = function(){ // add up something special for me worker.queue( function(next){ //worker.clearQueue(); //worker = $("<div />"); //cleanup for next .each //maybe another .each } ); }; $.each( get_array , function( key , value ) { $.queuedAjax({ type: 'GET', url: '/some.php?get='+value, dataType: 'text', success: function(sourcecode){ if (sourcecode.match(/stop your requests, idiot!/)) { worker.clearQueue().queue($.queuedSomething); alert(' the server told me to stop. i stopped all but not the last ´$.queuedSomething()´ '); } } }); }); $.queuedSomething(); 

मेरा मुद्दा भी ऐसा ही था,

अगर यह आपके लिए यह आयात नहीं है कि एजेक्स-कॉल एसिंक है (भले ही यह एजेक्स का "ए" है) आप एजेक्स-एसिंक के लिए अनुरोध करने के लिए बस jQuery को बता सकते हैं। यह मेरे लिए काम करता है और एक बड़ा समाधान की आवश्यकता नहीं लाता है

  $.ajax({ ... async: false }); 

मुझे यह उल्लेख करना चाहिए कि यह jQuery 1.8 के बाद से पदावनत है और यह डेटा टाइप के साथ काम नहीं करेगा: 'jsonp'