2013-07-29 8 views
5

मैं एकाधिक यूआरएल से JSON प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं। हालांकि, जब कोई URL विफल हुआ या 404 प्रतिक्रिया प्राप्त करता है तो निष्पादन कार्य नहीं करता है। मैंने jquery दस्तावेज़ पढ़ा और मुझे पता है कि "तब" निष्पादित होना चाहिए चाहे कोई कॉल विफल हो। आप, सफलताओं और असफलताओं की परवाह किए बिना एक ही कॉलबैक फोन का उपयोग करने के deferred.always() (documentation) चाहते हैं

$.when.apply($, calls).then(function() { 
    do_something(data); 
}, function() { 
    // something failed 
}); 

:

var data = {}; 
var calls = []; 
for (var i in funcs) { 
    calls.push(
     $.getJSON(base_url+i, 
      (function(i) { 
       return function(d) { 
        data[i] = d; 
       }; 
      }(i)) 
     ) 
    ); 
} 
$.when.apply($,calls).then(function() { 
    do_something(data); 
}); 
+0

क्या आपको सभी अनुरोधों के समाप्त होने पर यह नियंत्रित करने की आवश्यकता है या यह प्रत्येक अनुरोध के लिए हो सकता है? –

+0

संख्या।मैं सिर्फ एकत्रित डेटा की सरणी प्राप्त करना चाहता हूं। इसलिए यदि इस यूआरएल में कोई डेटा नहीं है तो अनदेखा करें। लेकिन सबसे महत्वपूर्ण बात यह है कि मैं do_something (डेटा) बनाना चाहता हूं; – user2581550

+1

निष्पादित करें यदि आप AJAX कॉल में से एक विफल होने पर भी 'do_something (डेटा)' चलाने के लिए चाहते हैं, तो '$ .when()' उपयोग करने का सही तरीका नहीं हो सकता है। जैसे ही कॉल में से एक विफल हो जाता है, यह विफल हो जाता है (और इसे हल करने के बजाय इसे वापस किए गए वादे को अस्वीकार करता है)। –

उत्तर

2

आप deferred.then() का दूसरा पैरामीटर (documentation) उपयोग करने की आवश्यकता

$.when.apply($, calls).always(function() { 
    do_something(data); 
}); 

jQuery.when() documentation पढ़ने के लायक भी है, जो एक से अधिक deferre जब एकत्रीकरण बताता है डी वस्तुओं को पारित कर रहे हैं।

+0

की तरह काम नहीं करेगा क्या do_something (डेटा) बनाने का कोई तरीका है; कोई फर्क नहीं पड़ता कि यह असफल रहा या नहीं। – user2581550

+0

हाँ, आप फंक्शन को – Mangiucugna

+0

दोनों बंद कर सकते हैं ठीक है, मैं दोनों में कार्यों को रखने के लिए थोड़ा आलसी हूं। – user2581550

2

jQuery डॉक्स के रूप में .then समारोह अपने मामले deferred.then(doneCallbacks, failCallbacks)

में दो (या तीन) तर्क लेता है तो तुम में नाकाम रहने के अनुरोध को पूरा करने के लिए दूसरा समारोह निर्दिष्ट करने के लिए की जरूरत है।

अर्थात

$.when.apply($,calls).then(function() { 
    alerT('ok'); 
}, function() { 
    alert('fail'); 
}); 

यहाँ एक सरल बेला: http://jsfiddle.net/rrMwr/

आशा इस मदद करता है

5

always विधि पर एक नजर डालें। इसे both cases में निष्पादित किया जाएगा। उदाहरण के लिए: (। यानी एक = डेटा, ख = jqXHR)

$.when.apply($, calls).always(function() { 
    alert('Resolved or rejected'); 
}); 

सफल लेन-देन के जवाब में, तर्क .done() के रूप में ही कर रहे हैं और विफल लेनदेन तर्क .fail के समान होते हैं के लिए() (यानी ए = jqXHR, बी = त्रुटि ट्राउन)। (c)

2

मैं jQuery दस्तावेज़ पढ़ सकते हैं और मैं जानता हूँ कि "फिर" कोई बात नहीं कॉल में से एक में नाकाम रही है पर अमल करना चाहिए।

नहीं, वादा ही पूरा हो जाता है पारित कर दिया वस्तुओं की सभी पूरा कर रहे हैं। यदि उनमें से एक विफल रहता है, तो परिणाम अस्वीकार कर दिया जाएगा।

do_something (डेटा) बनाने का कोई तरीका है; कोई फर्क नहीं पड़ता कि यह असफल रहा या नहीं।

आप .always इस्तेमाल कर सकते हैं:

// doSomething waits until all are fulfilled or one is rejected 
$.when.apply($,calls).always(do_something); 

फिर भी, आप शायद (यदि पूरा या अस्वीकार कर दिया कोई बात नहीं) कॉलबैक निष्पादित करने के लिए जब सभी calls हल कर रहे हैं चाहते हैं - allSettled तरह प्र में है jQuery के साथ, आपको थोड़ा सा काम करना होगा:

var calls = $.map(funcs, function(_, i) { 
    var d = new $.Deferred; 
    $.getJSON(base_url+i).done(function(r/*…*/) { 
     d.resolve(i, r); 
    }, function(/*…*/) { 
     d.resolve(); 
    }); 
    return d.promise(); 
}); 
$.when.apply($, calls).then(function() { 
    var data = {}; 
    for (var i=0; i<arguments.length; i++) 
     data[arguments[i][0]] = arguments[i][1]; 
    do_something(data); 
}); 
+0

मुझे सभी डेटा नहीं चाहिए। यदि क्वेरी में से कोई डेटा नहीं है तो मैं इसे नहीं दिखाता हूं। इस के आसपास कैसे हो। हमेशा काम नहीं करता है। – user2581550

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

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