2013-08-25 5 views
8

मैं एपीआई Async से डेटा का एक गुच्छा लोड करने की कोशिश कर रहा हूं और जब सभी डेटा लोड हो जाता है तो मैं एक ईवेंट ट्रिगर करना चाहता हूं कि सभी डेटा लोड हो। मेरी समस्या यह है कि मैं जिस एपीआई का उपयोग कर रहा हूं वह प्रतिक्रिया वस्तुओं की संख्या को पांच तक सीमित कर देता है। और मुझे संभावित रूप से 30-40 प्रतिक्रिया वस्तुओं को पुनर्प्राप्त करने की आवश्यकता होगी।एक JQuery के अंदर अजाक्स अनुरोधों के माध्यम से कैसे लूप करें - फिर स्टेटमेंट?

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

कोड पर मैंने कोशिश की है।

function loadsLotsOfStats(stats, dataType, eventName, dataName, callback) { 
    var groupedStats = []; 
    while (stats.length > 0) { 
     groupedStats.push(stats.splice(0, 5).join('/')); 
    } 
    j$.when(
     groupedStats.forEach(function (d) { 
      loadJSONToData(model.apiUrl.replace("{IDS}", d), "json", "", dataName, function (d) { /*console.log(d);*/ }, true) 
     }) 
    ).then(function() { 
     j$(eventSource).trigger('dataLoaded', eventName); 
    }); 

loadJSONToData समारोह मूल रूप से एक Async $ .ajax के लिए सिर्फ एक आवरण कार्य है।

तो हाँ डेटा वास्तव में लोड होने से पहले ट्रिगर हो रहा है। इसके अलावा कुछ कारणों से जब मैं लूप को सही तरीके से डालने का प्रयास करता हूं (इसे वाक्यविन्यास त्रुटि के माध्यम से बयान दें?

क्या किसी के पास कोई सलाह है कि मैं अजाक्स अनुरोधों का एक समूह कैसे बना सकता हूं और प्रतीक्षा कर सकता हूं जब तक कि वे सभी पहले कॉम्प्लेटेड नहीं हो जाते मदद के लिए किसी ईवेंट को ट्रिगर? या एक दूर मैं वर्तमान में क्या है ठीक करने के लिए?

धन्यवाद।

+0

आप 'if (condition.length <10) {// कोड निष्पादित करने के लिए}} का भी उपयोग कर सकते हैं। –

+0

संभावित डुप्लिकेट [JQuery के माध्यम से 2 अजाक्स कॉल करने की कोशिश कर रहा है, और फिर डेटा को प्रीपेड करना (फ्रीकोडकैम्प ट्विच प्रोजेक्ट से लिया गया)] (http://stackoverflow.com/questions/42425885/trying-to-make-2-ajax- कॉल-थ्रू-जेक्वायरी-एंड-फिर-प्रीपेन्डिंग-द-डेटा-ले लिया-से) –

उत्तर

16

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

कहा जा रहा है कि, आप यह कैसे कर सकते हैं।

$ .ajax वास्तव में एक स्थगित वस्तु देता है, ताकि आप इसका उपयोग अपने लाभ के लिए कर सकें। इसके अलावा $। जब किसी भी स्थगित वस्तुओं को स्वीकार कर सकते हैं। इन दो तथ्यों को जोड़कर आपकी समस्या हल हो सकती है।

var deferreds = []; 
$.each(groupedStats, function(index, stat){ 
    deferreds.push(
     // No success handler - don't want to trigger the deferred object 
     $.ajax({ 
      url: '/some/url', 
      data: {stat: stat}, 
      type: 'POST' 
     }) 
    ); 
}); 
// Can't pass a literal array, so use apply. 
$.when.apply($, deferreds).then(function(){ 
    // Do your success stuff 
}).fail(function(){ 
    // Probably want to catch failure 
}).always(function(){ 
    // Or use always if you want to do the same thing 
    // whether the call succeeds or fails 
}); 

ध्यान दें कि यह दौड़ की स्थिति नहीं है। यद्यपि $ .ajax एसिंक्रोनस है, $ .each नहीं है, इसलिए आपके द्वारा $ $ प्राप्त करने से पहले स्थगित की आपकी सूची कुल सूची होगी। जब और $ .then/$ विफल/$ हमेशा पूरा हो जाने के बाद ही ट्रिगर हो जाएगा ।

संपादित करें: मैं 5s द्वारा विभाजन को जोड़ना भूल गया, लेकिन यह सामान्य विचार को दर्शाता है। आप शायद यहां से पता लगा सकते हैं कि इसे अपनी समस्या पर कैसे लागू करें। संयोग से, आप सरणी से अगले 5 परिणाम प्राप्त करने के लिए array.splice (0,5) का उपयोग कर सकते हैं। उपयोग करने के लिए सुरक्षित है; यदि तत्वों की कुल संख्या 5 से कम है, तो यह केवल शेष शेष तत्वों को ले लेगी।

+2

अंगूठे ऊपर, यह ठीक उसी तरह काम करता है जैसा मुझे इसकी आवश्यकता है। महान जवाब और अच्छी व्याख्या। समय के लिए धन्यवाद। और हां, मुझे आवश्यक डेटा तक पहुंचने का एक अलग तरीका दिखाई देगा, क्योंकि आपका अधिकार उस कारण के लिए है। – recneps

+0

महान स्पष्टीकरण! एक जादू की तरह काम करता है। – Mike

+0

मुझे खेद है कि अगर मुझे यह याद आ रही है, लेकिन आप – atwellpub

1

आप Async.js libray उपयोग कर सकते हैं। और each समारोह का प्रयास करें।

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