नहीं, हम अभी तक ऐसा नहीं कर सकते।
ES6 वादों रद्द समर्थन नहीं करते अभी तक । यह अपने रास्ते पर है, और इसका डिज़ाइन कुछ ऐसा है जिस पर बहुत से लोगों ने वास्तव में कड़ी मेहनत की है। ध्वनि निरस्तीकरण शब्दार्थ सही पाने के लिए कठिन हैं और यह कार्य प्रगति पर है। जीएच पर "भ्रूण" रेपो, एस्किस्कस और कई अन्य रिपोज पर दिलचस्प बहसें हैं, लेकिन अगर मैं आप होता तो मैं धैर्य रखता।
लेकिन, लेकिन, लेकिन .. रद्द करना वास्तव में महत्वपूर्ण है!
यह है, मामले की वास्तविकता रद्द करना क्लाइंट-साइड प्रोग्रामिंग में वास्तव में एक महत्वपूर्ण परिदृश्य है। आपके द्वारा वेब अनुरोधों को निरस्त करने जैसे मामले महत्वपूर्ण हैं और वे हर जगह हैं।
तो ... भाषा ने मुझे डरा दिया!
हाँ, इस बारे में खेद है। प्रॉमिस को आगे की चीजें निर्दिष्ट करने से पहले पहले प्राप्त करना था - इसलिए वे डोम के माध्यम से कल्पना करने के लिए, जैसे कुछ उपयोगी सामान के बिना गए .finally
और .cancel
- यह अपने रास्ते पर है। रद्द करना है नहीं एक बाद का विचार यह सिर्फ एक समय बाधा और एपीआई डिजाइन करने के लिए एक और अधिक पुनरावृत्ति तरीका है।
तो मै क्या कर सकता हूँ?
आपके पास कई विकल्प हैं:
- ब्लूबर्ड जैसी थर्ड पार्टी लाइब्रेरी का उपयोग करें जो कल्पना से बहुत तेज गति से आगे बढ़ सकती है और इस तरह से रद्द करने के साथ-साथ अन्य अच्छाइयों का एक गुच्छा भी है - यही व्हाट्सएप जैसी बड़ी कंपनियां करती हैं।
- एक रद्दकरण टोकन पास करें ।
थर्ड पार्टी लाइब्रेरी का उपयोग करना बहुत स्पष्ट है। एक टोकन के लिए, आप अपने तरीके से एक फंक्शन ले सकते हैं और फिर उसे कॉल कर सकते हैं, जैसे:
function getWithCancel(url, token) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url);
return new Promise(function(resolve, reject) {
xhr.onload = function() { resolve(xhr.responseText); });
token.cancel = function() {
xhr.abort();
reject(new Error("Cancelled"));
};
xhr.onerror = reject;
});
};
जो आपको करने देगा:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
आपका वास्तविक उपयोग मामला - last
यह टोकन दृष्टिकोण के साथ बहुत कठिन नहीं है:
function last(fn) {
var lastToken = { cancel: function(){} };
return function() {
lastToken.cancel();
var args = Array.prototype.slice.call(arguments);
args.push(lastToken);
return fn.apply(this, args);
};
}
जो आपको करने देगा:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
और नहीं, बेकन और आरएक्स जैसे पुस्तकालय यहां चमकते नहीं हैं क्योंकि वे अवलोकन योग्य पुस्तकालय हैं, उनके पास केवल वही लाभ है जो उपयोगकर्ता के स्तर का वादा करता है पुस्तकालयों की कल्पना नहीं है। मुझे लगता है कि जब हम पर्यवेक्षक मूल निवासी होंगे, तो हम ES2016 में इंतजार करेंगे और देखेंगे। हालांकि वे टाइपिंगहेड के लिए निफ्टी हैं ।