2014-10-29 34 views
5

मैं कुछ पुराने कोड को बदलने की प्रक्रिया में हूं जो jQuery डिफर्ड ऑब्जेक्ट्स का उपयोग करता है और मैं ब्लूबर्ड/ईएस 6 वादे का उपयोग करके पुनः लिख रहा हूं।सभी जावास्क्रिप्ट ES6 वादे के बाद कैसे चलें

यदि मेरे पास एकाधिक असीमित कॉल हैं, तो सभी वादों के समाधान के बाद मैं फ़ंक्शन कैसे ट्रिगर कर सकता हूं।

का उपयोग jQuery Deferreds यह कुछ इस तरह होगा:

var requests = [...]; //some arbitrary data that is iterated to generate multiple ajax requests 
var promises = []; 
resuests.forEach(function(endpoint) { 
    promises.push($.ajax({url: endpoint})); 
}); 

$.when.apply($, promises).then(function() { 
    alert('all promises complete!'); 
}); 

मैं इस का उपयोग कर ES6 वादा वाक्य रचना कैसे पुनर्लेखन करते हैं?

+1

कि 'हो सकता है $ .when.apply तो (...' - बहुत ($, requests.map ($ मिल)।)। क्लीनर –

उत्तर

5

इस के बाद से दो अच्छे समाधान आप पहले से ही यहाँ मिल गया है एक अधिक "Bluebird" तरीका है के अलावा टैग है:

var requests = [...]; 

Promise.map(requests, $.get).then(function(results){ 
    alert('all promises complete!'); 
}); 

यह शायद है जैसा कि यह आसान हो जाता है।

जैसा कि अन्य ने बताया है, देशी es6 तरीका Promise.all, Promise.resolve का उपयोग करना होगा या स्पष्ट निर्माण की आवश्यकता है। देशी वादों से स्पष्ट तरीका शायद होगा:

var requests = [...]; 
Promise.all(requests.map($.get)).then(function(results){ 

}); 
jQuery वादा वाक्य रचना के साथ
+0

वास्तव में महान जवाब और मैं ब्लूबर्ड वाक्यविन्यास की सराहना करता हूं। मैं वर्तमान में ब्लूबर्ड का उपयोग कर रहा हूं, लेकिन मूल वाक्यविन्यास से चिपक सकता हूं क्योंकि मैं ब्लूबर्ड को हटाने पर विचार कर सकता हूं जब ईएस 6 आधिकारिक तौर पर प्रमुख ब्राउज़रों में समर्थित है। – dave

5

Promise.all का उपयोग करना। ध्यान दें कि के विपरीत, के विपरीत, एक तर्कसंगत जैसे एरे के रूप में इसकी तर्क के रूप में लेता है, इसलिए .apply की आवश्यकता नहीं है।

आप Promise.resolve(thejQueryDeferred) का उपयोग कर jQuery डीफ़र्ड को मूल ES6 वादे में कनवर्ट करना भी चाहेंगे। संपादित करें: यह कॉल द्वारा Promise.all पर पूर्ण रूप से किया जाता है, इसलिए वास्तव में वैकल्पिक है।

पूरे कोड:

var requests = [...]; //some arbitrary data that is iterated to generate multiple ajax requests 
var promises = []; 
requests.forEach(function(endpoint) { 
    var nativePromise = Promise.resolve($.ajax({url: endpoint})); // if you want to make it clear that you're converting from jQuery Deferred to ES6 promise! 
    promises.push(nativePromise); 
}); 

Promise.all(promises).then(function() { 
    alert('all promises complete!'); 
}); 
+0

धन्यवाद, अपडेट किया गया। ध्यान दें कि केवल 'Promise.resolve (thejQueryDeferred) 'एक jQuery को एक ईएस 6 वादा (' प्रोमेज.रेसोल्व 'चेक' के बाद 'संपत्ति के लिए चेक करने के लिए पर्याप्त है और तदनुसार कार्य करता है) – Shai

+0

@dfsq वास्तव में - यह है। वादे/ए + के आसपास मूल वादे बनाए गए थे, जो बदले में इस तरह से उपभोग करने वाले jQuery वादे संभवतः बनाया गया है। इसका उद्देश्य है। –

+0

'.resolve' टिप्पणी के लिए - आपको वास्तव में आवश्यकता नहीं है ऐसा करें, 'Promise.resolve' स्वचालित रूप से आपके लिए किया जाता है जब एक मूल वादे एक विदेशी' उपभोग्य का उपभोग करता है। आप इसे देख सकते हैं I n spec (या यहां तक ​​कि एमडीएन, जिसे आपने लिंक किया था)। –

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