2011-11-11 6 views
5

मैं jQuery का उपयोग कर रहा हूं और मेरे पास एसिंक्रोनस AJAX अनुरोधों का एक लूप है। मुझे पता है कि मैं उन सभी के लिए इंतजार कर सकता हूं जो आसानी से '$ .when.apply (array_of_requests) .then()' विधि का उपयोग कर समाप्त हो जाएं।नेस्टेड async तक इंतजार कैसे करें jQuery AJAX अनुरोध समाप्त हो गए हैं?

लेकिन मैं यह भी AJAX अनुरोध करता है कि केवल के बाद पहली अनुरोध के प्रत्येक पूरा कर लें क्रियान्वित कर रहे हैं का एक और सेट है। मैं उनके लिए भी खत्म होने का इंतजार करना चाहता हूं, लेकिन मुझे 100% यकीन नहीं है कि मुझे सबसे अच्छा तरीका मिला है।

var intital_data = [1,2,3,4,5,6,7,8,9,10]; 
var promises = []; 
var promises_inner = []; 

$.each(intitial_data, function(i, n) { 
    var ajax_call = $.ajax({url:'http://www.domain.com/etc/'+n}); 
    promises.push(ajax_call); 

    ajax_call.done(function(data) { 
     var ajax_call_inner = $.ajax({url:'http://www.domain.com/etc/'+data.result}); 
     promises_inner.push(ajax_call_inner); 

     ajax_call_inner.done(function(data) { 
      // Do something with the content of data here. 
     }); 
    }); 
}); 

तो, जब दस में से प्रत्येक लूप में चलाए AJAX अनुरोध किया जाता है, मैं पहली बार के परिणामों पर आधारित एक दूसरे AJAX अनुरोध करना:

यहाँ मेरी अनुरोधों का एक सरल उदाहरण है। यह सब ठीक काम करता है।

मैं तो, कुछ इस तरह है क्योंकि मैं पूरा कर रहे हैं (वादों सरणी में संग्रहीत) और दूसरा बहुत कुछ (promises_inner में संग्रहीत) दोनों पहले दस अनुरोधों तक इंतजार करना चाहते हैं:

$.when.apply($, promises).then(
    function() { 
     // The ten outer AJAX calls are finished now. 

     $.when.apply($, promises_inner).then(
      function() { 
       // The inner AJAX calls are finished now. 
      } 
     ); 
    } 
); 

पहले $ .when.apply() में। फिर() 's' done 'फ़ंक्शन दूसरा अनुरोध अभी तक पूरा नहीं हुआ है, या यहां तक ​​कि वाद-विवाद सरणी में भी जोड़ा गया है। लेकिन मैंने पाया कि एक नेस्टेड $ .when.apply() जोड़ने तो() काम करने के लिए लगता है -। अपने 'पूर्ण' समारोह के भीतर सभी अनुरोध समाप्त कर दिया है।

लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा, और सबसे मजबूत, समाधान है। मुझे चिंता है कि यह केवल संयोग से काम करता है - यह तर्कसंगत समझने के बजाय कॉल समाप्त होने के लिए पर्याप्त देरी कर रहा है।

वहाँ एक बेहतर, अधिक रॉक-ठोस, समाधान है? धन्यवाद।

+0

मैं बहुत जल्द ही बात की थी जब मैंने कहा कि यह काम करने लगता है। कभी कभी यह काम करता है, लेकिन अन्य समय, promises_inner के सभी था नहीं किया गया है नेस्टेड AJAX प्रश्न विज्ञापन अभी तक इसे समर्पित करें। तो कभी-कभी आंतरिक $। जब सब कुछ वापस कर दिया जाता है तो होता है। –

उत्तर

2

1.7 में $ .Callbacks पर एक नजर डालें। मुझे लगता है कि आप अपनी खुद की "प्रवाह" बनाने और उन्हें पुन: उपयोग करने की क्षमता, एक बार दौड़ने की क्षमता के बारे में उत्साहित होंगे।

आपके द्वारा किए गए कार्यों में कुछ भी गलत नहीं है (लागू पैटर्न पहली पसंद नहीं हो सकता है सबसे की, वे आम तौर पर सिर्फ उन्हें एक $ .जब में सूची (ए, बी, सी ....) - लेकिन आप $ .Callbacks बेहतर की वाक्य रचना पसंद कर सकते हैं

+0

सूचक के लिए धन्यवाद। $ .लबैक डॉक्स मेरे मस्तिष्क को चोट पहुंचा रहे हैं, लेकिन मुझे उम्मीद है कि यह अंततः डूब जाएगा! इस बीच, क्या आपको लगता है कि मेरा घोंसला $। जब ... विश्वसनीय होना चाहिए? –

+0

हमें हमारे बीमा ऐप में नियमों को संसाधित करते समय समान चीजें करना है क्योंकि कम से कम 10 सेवाएं शामिल हैं। दूसरी चीज जो आप कर सकते हैं जो पढ़ने में आसान हो सकती है, एक डिफर्ड बनाएं और इसे पूरा करने पर केवल इसे हल करें। कॉलबैक के अगले सेट के लिए .done के रूप में Deferred का वादा का उपयोग करें। एडी ओस्मानी के पास कॉलबैक पर एक अच्छा लेख है और शायद अधिक आ रहे हैं। – AutoSponge

0

केवल एक करने के लिए मुख्य वादे के साथ इस प्रयास करें। (संकल्प) fullfill प्रति पाश रन (inner_promise यहाँ अभी भी कहा जाता है)।

var initial_data = [1,2,3,4,5,6,7,8,9,10]; 
var promises_inner = []; 

initial_data.forEach(function(n) { 
    // Create promise for the inner call here. 
    var promise_inner = $.Deferred(); 
    promises_inner.push(promise_inner); 

    $.ajax({url:'http://www.domain.com/etc/'+n}).done(function(data) { 
     $.ajax({url:'http://www.domain.com/etc/'+data.result}).done(function(data) { 
      // Do something with the content of data here. 
      promise_inner.resolve(); 
     }); 
    }); 
}); 
console.log("promises_inner contains " + promises_inner.length + " promises") // should contain all the 10 promises 

$.when.apply($,promises_inner).done(function() { 
    // The inner AJAX calls are finished now 
}) 
संबंधित मुद्दे