2013-02-11 14 views
5

मैं सीमित धाराओं के साथ अनुक्रमिक अतुल्यकालिक ajax अनुरोध करने के लिए की जरूरत की दी गई संख्या के साथ अनुक्रमिक अतुल्यकालिक ajax अनुरोध कैसे करना है। अभी तक मुझे वेब सर्वर पर केवल एक स्ट्रीम पर कब्जा करने की अनुमति है इसलिए मैं समय पर केवल एक AJAX अनुरोध कर सकता हूं।धाराओं

मैं समारोह जो मुझे मदद करता है जब मैं एक समय में केवल एक धारा के उपयोग की अनुमति निम्नलिखित है।

function initiateChain() { 
    var i = 0; 
    var tasks = arguments; 
    var callback = function() { 
     i += 1; 
     if (i != tasks.length) { 
     tasks[i](callback); //block should call callback when done otherwise loop stops 
     } 
    } 
    if (tasks.length != 0) { 
     tasks[0](callback); //initiate first one 
    } 
    } 

कहते हैं कि अगर मैं तीन ajax सहायक कार्यों

function getGadgets(callback) { 
     //ajax call 
     callback(); // I call this in complete callback of $.ajax 
} 

function getBooks(callback) { 
     //ajax call 
     callback(); // I call this in complete callback of $.ajax 
} 

function getDeals(callback) { 
     //ajax call 
     callback(); // I call this in complete callback of $.ajax 
} 

आह्वान के बाद है सुनिश्चित करता है कि अधिक से अधिक 1 ajax अनुरोध इस ग्राहक से बनाया गया है

initiateChain(getGadgets, getBooks, getDeals); 

अब मैं initiateChain को बढ़ाने के लिए की जरूरत है धाराओं की मनमानी संख्या का समर्थन करने के लिए। मैं धाराओं के 2 या n नंबर का उपयोग करने मैं चाहूँगा विचारों को पता है ऐसा करने के लिए ajax सहायक कार्यों getGadgets, getDeals, getDeals बदले बिना अनुमति कहो।

संक्षेप में, मेरे पास फ़ंक्शन का एक सेट है, एन, इस मामले में गैजेट्स, getDeals और getDeals (| N | = 3) जिन्हें प्रत्येक को वेब सर्वर से कनेक्शन चाहिए। वर्तमान में, मैं केवल एक ही समय में एक अनुरोध निष्पादित कर सकता हूं, इसलिए आरंभ करें चेन फ़ंक्शन अनुक्रम में तीन विधियों को कॉल करता है। अगर मेरे पास एम कनेक्शन तक पहुंच थी, तो मैं निष्पादित करना चाहता हूं | एन | समानांतर में कार्य (अधिकतम एम तक)।

+1

वास्तव में क्या आपके प्रश्न है? – jfriend00

+0

जैसा कि मैंने उल्लेख किया मैं, कार्य, एन का एक सेट है कि इस मामले में getGadgets, getDeals और getDeals (| एन | = 3) कि प्रत्येक वेब सर्वर से कनेक्शन की जरूरत है। वर्तमान में, मैं केवल एक ही समय में एक अनुरोध निष्पादित कर सकता हूं, इसलिए आरंभ करें चेन फ़ंक्शन अनुक्रम में तीन विधियों को कॉल करता है। अगर मेरे पास एम कनेक्शन तक पहुंच थी, तो मैं निष्पादित करना चाहता हूं | एन | समानांतर में कार्य (अधिकतम एम तक)। – harsha

उत्तर

14

आप jQuery का उपयोग कर रहे हैं तो आप के लिए अपनी .queue विधि का उपयोग कर सकते हैं निम्नलिखित गया अपने AJAX कॉल कतारबद्ध करें और फिर अनुक्रम में उन्हें निष्पादित करें। एकाधिक अनुक्रमों को चलाने के लिए, आप प्रारंभिक डेक्यू को लूप में लपेट सकते हैं।

function add_api_call_to_queue(qname, api_url) { 
    $(document).queue(qname, function() { 
     $.ajax({ 
      type  : 'GET', 
      async : true, 
      url  : api_url, 
      dataType : 'json', 
      success : function(data, textStatus, jqXHR) { 
       // activate the next ajax call when this one finishes 
       $(document).dequeue(qname); 
      } 
     }); 
    }); 
} 

$(document).ready(function() { 

    var queue_name  = 'a_queue'; 
    var concurrent_calls = 2; 

    // add first AJAX call to queue 
    add_api_call_to_queue(queue_name, '/example/api/books'); 

    // add second AJAX call to queue 
    add_api_call_to_queue(queue_name, '/example/api/dvds'); 

    // add third AJAX call to queue 
    add_api_call_to_queue(queue_name, '/example/api/shoes'); 

    // start the AJAX queue 
    for (i=0;i<concurrent_calls;i++) { 
     $(document).dequeue(queue_name); 
    } 

}) 
+0

धन्यवाद। यह वांछित के रूप में काम करता है। – harsha

+0

यदि यह काम करता है, तो क्या आप उत्तर को विजेता उत्तर के रूप में चिह्नित कर सकते हैं। धन्यवाद –

+0

यह स्मार्ट है! बहुत बहुत धन्यवाद। – Kevindra

1

जब तक आपके कॉलबैक सभी तुल्यकालिक यह आप के लिए काम करना चाहिए यदि सही रास्ते

var initiateChain = function() { 

    var args = arguments, 
     index = 0, 
     length = args.length, 
     process = function (index) { 

      if (index < length) { 
       $.ajax({ 
        url: '/example.php', 
        complete: function() { 
         // Callbacks get run here 
         args[ index ]; 
         process(++index); 
        } 

       }); 
      } 


     }; 

    if (length) { 
     process(0); 
    } 

}; 

initiateChain(getGadgets, getDeals, getDeals); 
0

धन्यवाद @James पर आप नहीं डाल रहे हैं, मैं तुम्हें लंबाई के लिए क्या संपादित से सुराग मिला है। जैसे कि कॉल async AJAX अनुरोध हैं। तो विचार के async कॉल अग्रिम एम नंबर बनाने में है। फिर वे उन लोगों को जारी रखेंगे जब प्रत्येक व्यक्ति पूरा हो जाएगा।

मैं NodeJS के साथ प्रयोग किया है और initiateChain निम्नलिखित अपेक्षित तरीके से काम

var calls = []; 

function initiateChain() { 
    var i = 0; 
    var maxSteams = 2; 
    var tasks = arguments; 
    var callback = function() { 
     i += 1; 
     if (i < tasks.length) { 
     tasks[i](callback); //block should call callback when done otherwise loop stops 
     } 
    } 
    if (tasks.length) { 
     i = ((tasks.length > maxSteams) ? maxSteams : tasks.length) - 1; 
     for (var j = 0; j < maxSteams; j+=1) { 
     if (j < tasks.length) { 
      tasks[j](callback); //initiate first set 
     } else { 
      break; 
     } 
     } 
    } 
} 

//test methods 
for(var k = 0; k < 8; k+=1) { 
    calls[k] = (function (message, index) { 
    return function (callback) { 
     var ts = new Date().getTime(); 
     console.log(message + " started - " + ts); 
     setTimeout(function() { 
     ts = new Date().getTime(); 
     console.log(message + " completed - " + ts); 
     callback(); 
     }, index * 1000); 
    }; 
    })("call" + (k+1), (k+1)) 
} 

initiateChain(calls[0], calls[1], calls[2], calls[3], 
    calls[4], calls[5], calls[6], calls[7]); 

अपने प्रयोग में मैं परिणाम

call1 started - 1360580377905 
call2 started - 1360580377926 

call1 completed - 1360580378937 
call3 started - 1360580378937 

call2 completed - 1360580379937 
call4 started - 1360580379937 

call3 completed - 1360580381945 
call5 started - 1360580381945 

call4 completed - 1360580383946 
call6 started - 1360580383946 

call5 completed - 1360580386959 
call7 started - 1360580386959 

call6 completed - 1360580389950 
call8 started - 1360580389950 

call7 completed - 1360580393972 

call8 completed - 1360580397959 
संबंधित मुद्दे