2011-04-24 10 views
5

मैं HTML में JQuery का उपयोग करके संचालन के निम्न अनुक्रम को पूरा करने का प्रयास कर रहा हूं।समानांतर में कई AJAX अनुरोध करें, और उनमें से सभी के बाद एक फ़ंक्शन चलाएं

  • यूआरएल की एक सूची
  • इन url समानांतर
  • प्रतीक्षा में $ .getJSON (यूआरएल) का उपयोग कर सभी अनुरोधों को पूरा करने या विफल करने के लिए अनुरोध किया गया है में से प्रत्येक का निर्माण किया है (404 हो सकता है)
  • सभी पूर्ण JSON- अनुरोधों का डेटा लें और कुछ करें।

मैंने नीचे पोस्ट किए गए जावा-स्क्रिप्ट कोड का निर्माण किया। यह 404-त्रुटि के कारण अनुरोधों में से एक विफल होने के बावजूद यह काम करता है: फिर, $.when नहीं चलता है क्योंकि अनुरोध विफल होने पर तुरंत बंद हो जाता है। क्या आप किसी भी तरह से AJAX अनुरोधों को ओवरराइड कर सकते हैं, इसलिए वे असफल नहीं होते हैं बल्कि बदले में एक खाली स्रोत लौटाते हैं?

मैंने पहले से ही this और this पोस्ट पढ़ा है, लेकिन यह कोई समाधान नहीं प्रदान करता है जहां सभी प्रश्नों को पूरा करने के बाद कोड चलाया जा सकता है।

function fetchData() { 
    queries = []; 
    //urls is initialized somewhere else containing all urls 
    for(var url in urls) { 
     queries.push($.getJSON(url)); 
    } 

    $.when.apply(this, queries).done(function() { 
     console.log("Finished all queries, got "+arguments.length+" results"); 
     //Now arguments is a array containing the results of all requests 
    } 

    //function returns instantly, no problem! 
} 
+0

मुझे jquery में अनुभव नहीं हुआ है, लेकिन ऐसा लगता है कि आपको क्वेरी काउंटर की आवश्यकता है। अर्थात। आपके द्वारा भेजे जाने वाले प्रश्नों की संख्या के लिए एक काउंटर सेट करें। सफलता में, या संबंधित त्रुटि, फ़ंक्शन, काउंटर को कम करता है (जावास्क्रिप्ट में असामान्य कमी परमाणु है?)। एक बार काउंटर शून्य तक पहुंचने के बाद, आप जानते हैं कि सभी अनुरोध किए गए हैं और आप परिणामों को संसाधित कर सकते हैं।बेशक, सभी प्रश्नों को पूरा करने के बाद आपको बाद में प्रसंस्करण के लिए प्रश्नों के परिणामों को कैश करना होगा। – ewh

+0

डुप्लिकेट: http://stackoverflow.com/questions/1060539/parallel-asynchronous-ajax-requests-using-jquery – joeytwiddle

उत्तर

2

मैं कुछ इस तरह कर सकते हैं:

$(document).ready(function(){ 
    var _q = ['/echo/json/', '/echo/json/', 'mybadurl']; 
    var _d = []; 
    for(u in _q) 
    { 
     $.ajax({ 
      url: _q[u], 
      success: function(data){ 
       pushData(data); 
      }, 
      error: function(x){ 
       pushData(x); 
      } 
     }); 
    } 

    function pushData(d) 
    { 
     _d.push(d); 
     if(_d.length == _q.length) 
     { 
      alert('were done'); 
     } 
    } 
}); 

यहाँ, आप डेटा या तो सफलता या त्रुटि से सरणी _d और परीक्षण पर आप आगे बढ़ने से पहले सभी उत्तर प्राप्त हो गया है सुनिश्चित करने के लिए जोर दे रहे हैं (alert('were done');)।

बेशक, आप _d में पेलोड के साथ ऑप स्टेटस वाले ऑब्जेक्ट को दबाकर यह स्मार्ट बना सकते हैं, लेकिन यह एक त्वरित हैक एक साथ था यह दिखाने के लिए कि मैं जो पूछ रहा हूं उसके बारे में सबसे अधिक संभावना है ।

Fiddle here

1

कुछ इस तरह:

function fetchData() { 
    queries = []; 
    //urls is initialized somewhere else containing all urls 
    for(var url in urls) { 
     queries.push($.getJSON(url)); 
    } 

    var returned = 0; 
    for (var i = 0; i < queries.length; i += 1) { 
     call_ajax_somehow(queries[i], function() { 
      console.log("callback called"); 
      returned += 1; 
      if (returned === queries.length) { 
       console.log("Got all " + queries.length + " of them"); 
      } 
     }); 
    } 
} 

आप कैसे वास्तव में है और यह कॉल करने के लिए कैसे त्रुटियों को संभालने के लिए पर jQuery ajax जानकारी की जांच करें करना होगा (यानी, त्रुटि कॉलबैक निर्दिष्ट करने का तरीका) लेकिन कोड को संशोधित करना बहुत मुश्किल नहीं होना चाहिए।

1

इस तरह काम करना चाहिए:

function fetchData() { 
    var queriesRun = 0; 
    var allData = []; 

    var urls = ["http://stackoverflow.com", 
       "http://stackoverflow.com", 
       "http://stackoverflow.com", 
       "http://stackoverflow.com", 
       "http://stackoverflow.com/thisdoesnotexist"]; 

    var totalQueries = urls.length; 

    var complete = function(jqXHR, textStatus) { 
     queriesRun++; 
     console.log(queriesRun); 

     if(queriesRun == totalQueries) { 
      console.log("all done"); 
      console.log(allData); 
     } 
    }; 

    for(var i = 0; i < urls.length; i++) { 
     var url = urls[i]; 
     jQuery.ajax({ 
      url: url,   
      success: function(data, textStatus, jqXHR) { 
       allData.push(data); 
      }, 
      complete: complete 
     }); 
    } 
} 

के बाद से complete हैंडलर error और success हैंडलर के बाद, queriesRun हर बार AJAX कॉल पूरा करता वृद्धि हो जाएगी चलाता है। यह हैंडलर यह देखने के लिए भी जांच करता है कि क्वेरी की संख्या कुल प्रश्नों की संख्या के बराबर है या नहीं। यदि ऐसा है, तो यह डेटा के साथ काम करेगा।

मैंने कोड में console.log एस जोड़ा है ताकि आप आसानी से देख सकें कि क्या हो रहा है (बस इसे फायरबग में चलाएं)।

संबंधित मुद्दे