2016-02-10 8 views
5

मैं कई API कॉल बना रहा हूं, जिसके बाद मैं प्रत्येक कॉल के संयुक्त परिणाम लोड करना चाहते रद्द:

$.when(
    $.get(localAPI, data, function(response) { 
     globalStore.localShares = Number(response); 
    }), 

    $.get(facebookAPI, '', function(response){ 
     globalStore.facebookShares = Number(response[0].share_count); 
    }), 

    $.getJSON(pinterestAPI, {url: url}).done(function(response){ 
     globalStore.pinterestShares = Number(response.count); 
    }) 
).always(function(){ 
    //Do stuff 
}); 

$.get कॉल में विफल रहते हैं , $.always कॉलबैक फ़ंक्शन अभी भी निष्पादित करता है।

लेकिन

सिर्फ एक $.get कॉल विफल रहता है, यह पिछले कॉल की कार्रवाई को नकारता।

तो, यदि पहली कॉल विफल हो जाती है, तो globalStore दो आइटमों के साथ लौटाता है। यदि पहली कॉल सफल होती है लेकिन दूसरा विफल रहता है, तो globalStore केवल एक आइटम के साथ लौटाता है। और यदि पहले दो कॉल सफल होते हैं लेकिन अंतिम व्यक्ति विफल रहता है, तो globalStore खाली हो जाता है।

क्या इसके आसपास कोई रास्ता है?

संपादित करें:

हाँ, मैं संभाल करने की कोशिश की है $.when इस तरह के भीतर विफल रहता है:

$.when(
    $.get(mu30_ajax_frontend.ajaxurl, data, function(response) { 
     globalStore.localShares = Number(response); 
    }).fail(function(){ 
     globalStore.localShares = 0; 
    }), 

    $.get(facebookAPI, '', function(response){ 
     globalStore.facebookShares = Number(response[0].share_count); 
    }).fail(function(){ 
     globalStore.facebookShares = 0; 
    }), 

    $.getJSON(pinterestAPI, {url: url}).done(function(response){ 
     globalStore.pinterestShares = Number(response.count); 
    }).fail(function(){ 
     globalStore.pinterestShares = 0; 
    }) 
).always(function(){ 
    //Do stuff 
}); 

लेकिन मैं एक ही परिणाम मिलता है।

+0

क्या आपने असफलताओं को संभालने का प्रयास किया है? '$ .get()। असफल (फ़ंक्शन (गलती) {})' –

+0

हां, मैंने अभी कोशिश की है। मैंने उपरोक्त कोड जोड़ा। अभी भी वही सटीक मुद्दा प्राप्त करें। – ibhhvc

+0

यह $ $ के एक डुप्लिकेट की तरह लगता है। परिभाषित: प्रत्येक वादा निष्पादित होने पर कैसे पता लगाया जाए] (http://stackoverflow.com/q/19177087/1048572), लेकिन मुझे यकीन नहीं है कि आप किस सटीक व्यवहार की अपेक्षा करते हैं अपने "रास्ते के आसपास" से। मेरी पिछली टिप्पणी के अनुसार – Bergi

उत्तर

5

$.when का उपयोग करते समय इस तरह कोई रास्ता नहीं है, अगर कोई अनुरोध विफल रहता है, तो पूरी श्रृंखला विफल हो जाती है।

आप deferreds का उपयोग करते समय सभी कॉल्स पूरा कर रहे हैं पता करने के लिए, के बजाय अपने खुद के रोल करना होगा, और हमेशा सफलतापूर्वक हल करने आदि

var defs = [new $.Deferred(), new $.Deferred(), new $.Deferred()]; 

$.get(localAPI, data, function(response) { 
    globalStore.localShares = Number(response); 
    defs[0].resolve(true); 
}).fail(defs[0].resolve); 

$.get(facebookAPI, '', function(response){ 
    globalStore.facebookShares = Number(response[0].share_count); 
    defs[1].resolve(true); 
}).fail(defs[1].resolve); 

$.getJSON(pinterestAPI, {url: url}).done(function(response){ 
    globalStore.pinterestShares = Number(response.count); 
    defs[2].resolve(true); 
}).fail(defs[2].resolve); 

$.when.apply($, defs).then(function(result) { 
    // result is an array, any true value is a successful request "[true, true, true]" 
}); 

verbosely लिखा है, यह कुछ कार्यों के साथ prettied जा सकता है और लूप इत्यादि

+0

...जवाब है क्योंकि jquery। –

+1

आपको [स्थगित एंटीपाटरर्न से बचें] (http://stackoverflow.com/q/23803743/1048572)! यहां तक ​​कि jQuery में, जिसमें 'पकड़' नहीं है, आप '.then (शून्य, फ़ंक्शन (गलती) {वापसी $। डिफर्ड() हल कर सकते हैं (" परवाह नहीं है ");})' – Bergi

0

मुझे लगता है कि मुझे जिस समाधान की आवश्यकता है वह वास्तव में एक साधारण था। मुझे सफलता या असफलता की परवाह नहीं थी, मैं सिर्फ यह जानना चाहता था कि AJAX कब किया गया था। तो:

$.get(mu30_ajax_frontend.ajaxurl, data, function(response) { 
    globalStore.localShares = Number(response); 
}); 

$.get(facebookAPI, '', function(response){ 
    globalStore.facebookShares = Number(response[0].share_count); 
}); 

$.getJSON(pinterestAPI, {url: url}).done(function(response){ 
    globalStore.pinterestShares = Number(response.count); 
}); 

$(document).ajaxStop(function(){ 
    //Do stuff 
}); 
0

jQuery $.when() डॉक्स (जोर मेरा) से:

मामले में जहां कई आस्थगित वस्तुओं jQuery.when() को पास किया जाता में, विधि देता है एक नया से वादा " मास्टर "डिफरर्ड ऑब्जेक्ट जो सभी डिफरर्डों की कुल स्थिति को ट्रैक करता है, इसे पारित कर दिया गया है। जैसे ही सभी डिफरर्ड हल हो जाते हैं, या मास्टर को अस्वीकार कर दिया गया है, जैसे ही डिफर्रेड को अस्वीकार कर दिया गया है, को अस्वीकार कर दिया गया है।

तो, हाँ jQuery.when तत्काल विफल हो जाएगा यदि पास किए गए वादे में से एक को अस्वीकार कर दिया गया है/विफल रहता है।

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