2013-04-05 8 views
6

समाप्त करने के लिए के लिए मैं एक समारोह जो एक दर्जन async ajax अनुरोध करता है लिखना तो सभी को समाप्त होने की प्रतीक्षा करें और फिर एकत्रित जानकारी वापस किए जाने वाले प्रतीक्षा करें। पसंद:async ajax अनुरोध

function countHealthy(urls) { 
    var healthy = 0; 
    for (var i = 0; i < urls.length; ++i) { 
    $.ajax({url: urls[i], async: true, id: i}) 
    .done(function (data) { ++healthy; }); 
    } 
    // Wait for all ajax to finish. 
    return healthy; 
} 

पीएस: ++ स्वस्थ धागा सुरक्षित है?

उत्तर

6

जावास्क्रिप्ट में धागे नहीं हैं इसलिए थ्रेड सुरक्षा कोई समस्या नहीं है। आपका रिटर्न स्टेटमेंट समस्या है, इसे कॉलबैक में जाना होगा कि AJAX कॉल पूरा होने पर निष्पादित हो। चूंकि अजैक्स असीमित रूप से होता है, क्योंकि आपका कोड खड़ा होता है, रिटर्न स्टेटमेंट सभी अनुरोधों की वापसी से पहले आग लग जाएगा।

आप query deferreds बाहर की जाँच करने के लिए है, जो बात के इस प्रकार के लिए पैदा किया जा रहा है चाहते हो सकता है। उस लिंक

function doAjax() { 
    return $.get('foo.htm'); 
} 

function doMoreAjax() { 
    return $.get('bar.htm'); 
} 

$.when(doAjax(), doMoreAjax()) 
    .done(function() { 
    console.log('I fire once BOTH ajax requests have completed!'); 
    }) 
    .fail(function() { 
    console.log('I fire if one or more requests failed.'); 
    }); 

कुछ मामूली पुनर्रचना के साथ से सीधे आप 2 मिनट में यह लागू हो सकता है।

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

1

आप ऐसा कर सकते हैं:

var urls= ['url1', 'url2', 'url3', 'url4']; 
function doTheUrl() { 
    if (urls.length === 0) { 
     alert('All urls are done now.'); 
     return; 
    } 

    var url = urls.pop(); 
    $.ajax({ 
     url: "/DoTheJob", 
     complete: function() { 
      doTheUrl(); 
     } 
    }); 
}; 
+0

वास्तव में मुझे नहीं लगता है कि यह काम करेगा। वहाँ समारोह के अंत में एक अंतर्निहित 'return' है। इसलिए जब $ .ajax कॉल स्टैक पर रखा जाता है, तो सबकुछ आगे बढ़ता रहता है और फ़ंक्शन निकलता है। मैं अब downvote होगा। – the0ther

0

हो सकता है कि आप इस कोशिश कर सकते हैं। मैं लूप के दौरान बस एक खाली चल रहा हूं ताकि सभी एजेक्स कॉल लौटाए जाने तक रिटर्न स्टेटमेंट हिट न हो।

function countHealthy(urls) { 
    var healthy = 0; 
    var urlCount = urls.length; 
    var numberOfAjaxCallsReturned = 0; 
    for (var i = 0; i < urls.length; ++i) { 
    $.ajax({url: urls[i], async: true, id: i}) 
     .done(function (data) { 
       ++healthy; 
       numberOfAjaxCallsReturned++; 
     }); 
    } 
    while(numberOfAjaxCallsReturned!=urlCount) 
    { 
    } 
    return healthy; 
} 
+1

इस पर बहुत बुरा प्रदर्शन, मेरी राय में उपयोगी नहीं है। –

0

यदि आपके पास एक जटिल पृष्ठ है, तो आप केवल अपने असीमित कॉल को वापस करने के लिए ट्रैक करना और प्रतीक्षा करना चाहेंगे। ऐसा इसलिए है क्योंकि अन्य, गैर-क्रूसुअल, कॉल चल रही हो सकती हैं।

कहा जा रहा है कि, सरल पृष्ठों के लिए आप बस जांच सकते हैं और कोई कॉल नहीं होने के लिए प्रतीक्षा कर सकते हैं। यह jQuery स्क्रिप्ट प्रत्येक तिमाही में यह देखने के लिए जांचती है कि प्रत्येक तिमाही दूसरे में वर्तमान एसिंक्रोनस अनुरोध हैं या नहीं। एक बार कोई नहीं होने के बाद, आप आगे बढ़ेंगे। सब से

var WaitForAjax = function() 
    { 
     if (jQuery.active == 0){ 
     } 
     else 
     { 
      setTimeout(WaitForAjax, 250); 
     } 
    } 

    function RunIt() 
    { 
     //IssueAjaxCalls would be where you make all your Ajax calls. 
     IssueAjaxCalls(); 

     WaitForAjax(); 

     //The KeepGoing function won't get called until there are no more Ajax calls pending. 
     KeepGoing(); 
    } 
0

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

फिर भी, यहाँ मैं कैसे यह

function countHealthy(urls) { 

    var healthy = 0; 
    var reqs = []; 

    for (var i = 0; i < urls.length; ++i) { 
     reqs.push(
      $.ajax({ 
       url: urls[i], 
       id: i 
      }) 
     ); 
    } 
} 


$.when.apply($, reqs).then(function() { 
    // On success 
    ++healthy; 
}).fail(function() { 
    // When failed 
}).always(function() { 
    // this will be run no matter the outcome 
}); 

करना चाहते हैं इसे आज़माने के लिए मौका नहीं हुई है, इसलिए अगर मैं परिवर्तन करने आदि में सिंटेक्स त्रुटि कर दिया है मुझे यकीन नहीं कर रहा हूँ कोड के अपने टुकड़ा:

निकाला गया async = true, इस पर ध्यान न दें, यदि आप इसे करने से पहले अपने कोड में कहीं गलत निर्धारित किया था।

आप कैसे "when.apply" काम करता है की एक विचार प्राप्त कर सकते हैं, source