दिलचस्प पोस्ट
कंसोल ऐप में सी # में async? कैसे बाश में दो तारों को अलग संस्करण स्वरूप में तुलना करें? चुंबकीय क्षेत्र एक्स, वाई, जीड वैल्यू को डिवाइस से वैश्विक संदर्भ फ्रेम में कनवर्ट करें कॉन्फ़िगरेशन सिस्टम को आरंभ करने में विफल बूटस्ट्रैप मोडल में एक विशेष फ़ील्ड के लिए फोकस कैसे सेट करें, इसे दिखाई देने के बाद ASP.NET MVC 5 मोनो में रेजर यूआर हेल्पर्स का उपयोग करते समय विधि 'RouteCollection.get_AppendTrailingSlash' नहीं मिला क्या printf का आउटपुट है ("% d% d", c ++, c); भी अपरिभाषित? JavaScript में डबल या एकल उद्धरणों का उपयोग कब करना है? तालिका में प्रत्येक समूह के लिए शीर्ष एन पंक्तियों का चयन करना SQL में दूसरे कॉलम के प्रत्येक मान के लिए सबसे सामान्य मान प्राप्त करें जावास्क्रिप्ट में मैं एक बिटवायर ऑपरेटर का उपयोग कहाँ करूँगा? कैसे जावा में पथ गठबंधन करने के लिए? गतिशील रूप से लोड हो रहा है सीएसएस स्टाइलशीट IE पर काम नहीं करता है मुझे TypeError क्यों मिलता है: प्रकार 'फ्लोट' के गैर-इंट द्वारा अनुक्रम को गुणा नहीं कर सकता? किसी फ़ाइल में Android लॉकेट डेटा लिखें

वादा – क्या एक वादा रद्द करना संभव है?

मैं अपने सभी नेटवर्क डेटा पुनर्प्राप्ति को प्रबंधित करने के लिए ईएस 6 के वचनों का उपयोग करता हूं और कुछ ऐसी स्थितियां हैं जहां मुझे उन्हें रद्द करना है।

मूल रूप से परिदृश्य ऐसा है कि मेरे पास यूआई पर टाइप-आगे खोज है जहां अनुरोध को बैकएंड में सौंप दिया गया है, आंशिक इनपुट के आधार पर खोज को पूरा करना है। हालांकि यह नेटवर्क अनुरोध (# 1) थोड़ा समय ले सकता है, उपयोगकर्ता टाइप करने के लिए जारी रहता है, जो अंततः एक और बैकेंड कॉल (# 2)

यहां # 2 स्वाभाविक रूप से # 1 पर प्राथमिकता लेता है, इसलिए मैं वादा लपेटने के अनुरोध # 1 रद्द करना चाहता हूं। मुझे पहले से ही डाटा लेयर में सभी वादे का कैश मिला है, इसलिए मैं सैद्धांतिक रूप से इसे पुनर्प्राप्त कर सकता हूं क्योंकि मैं # 2 के लिए वादा प्रस्तुत करने का प्रयास कर रहा हूं।

लेकिन मैं कैश से इसे पुनः प्राप्त करने के बाद वादा 1 # कैसे रद्द करूं?

क्या कोई एक दृष्टिकोण का सुझाव दे सकता है?

वेब के समाधान से एकत्रित समाधान "वादा – क्या एक वादा रद्द करना संभव है?"

नहीं। हम अभी तक ऐसा नहीं कर सकते।

ES6 वादे अभी तक रद्द करने का समर्थन नहीं करते हैं यह अपने रास्ते पर है, और इसकी डिज़ाइन बहुत कुछ लोगों पर कड़ी मेहनत की है। ध्वनि रद्दीकरण शब्दांकन सही पाने के लिए कठिन हैं और यह काम प्रगति पर है "फ़ेच" रेपो, ईएसडीस्कस पर और जीएच पर कई अन्य रेपो पर दिलचस्प बहसें हैं, लेकिन मैं सिर्फ अगर तुम थे तो मैं धैर्यवान रहूंगा।

लेकिन, लेकिन, लेकिन .. रद्दीकरण वास्तव में महत्वपूर्ण है!

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

बेनाम: तो … भाषा मुझे खराब कर दिया!

हाँ, इसके बारे में क्षमा करें आगे की बातें निर्दिष्ट किए जाने से पहले वादा किया जाना था – इसलिए वे कुछ उपयोगी चीजों के बिना चले गए। .finally और। .cancel – यह अपने रास्ते पर है, हालांकि, DOM के माध्यम से युक्ति पर। रद्दीकरण के बाद यह एक समय की बाधा नहीं है और एपीआई डिजाइन के लिए और अधिक गतिशील दृष्टिकोण है।

तो मै क्या कर सकता हूँ?

आपके पास कई विकल्प हैं:

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

तीसरी पार्टी लाइब्रेरी का उपयोग करना बहुत स्पष्ट है टोकन के लिए, आप अपना तरीका एक फ़ंक्शन ले सकते हैं और फिर इसे कॉल कर सकते हैं, जैसे:

 function getWithCancel(url, token) { // the token is for cancellation var xhr = new XMLHttpRequest; xhr.open("GET", url); return new Promise(function(resolve, reject) { xhr.onload = function() { resolve(xhr.responseText); }); token.cancel = function() { // SPECIFY CANCELLATION xhr.abort(); // abort request reject(new Error("Cancelled")); // reject the promise }; xhr.onerror = reject; }); }; 

जो आपको करने देगा:

 var token = {}; var promise = getWithCancel("/someUrl", token); // later we want to abort the promise: token.cancel(); 

आपका वास्तविक उपयोग केस – last

टोकन दृष्टिकोण के साथ यह बहुत मुश्किल नहीं है:

 function last(fn) { var lastToken = { cancel: function(){} }; // start with no op 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"); // this will get canceled synced("/url1?q=ab"); // this will get canceled too synced("/url1?q=abc"); // this will get canceled too synced("/url1?q=abcd").then(function() { // only this will run }); 

और नहीं, बैकन और आरएक्स जैसे पुस्तकालयों को यहां "चमक" नहीं है क्योंकि वे देखे जाने योग्य पुस्तकालय हैं, उनके पास सिर्फ एक ही फायदा है उपयोगकर्ता स्तर के वादे के पुस्तकालयों की कल्पना बाध्य नहीं होती है। मुझे लगता है कि हम इंतजार करेंगे और ES2016 में देखेंगे जब अवलोकन, देशी जाते हैं। हालांकि टाइपआहेड के लिए वे निफ्टी हैं

रद्द करने योग्य वादे के लिए मानक प्रस्ताव विफल रहे हैं।

एक वायदा एसिंक कार्रवाई को पूरा करने के लिए एक नियंत्रण सतह नहीं है; उपभोक्ता के साथ मालिक को भ्रमित करता है इसके बजाय, एसिंक्रोनस फ़ंक्शन बनायें जिसे कुछ पास-इन टोकन के माध्यम से रद्द किया जा सकता है।

एक और वादा एक अच्छा टोकन बनाता है, जिससे वादा को लागू करना आसान हो जाता है।

उदाहरण: पिछले श्रृंखला के प्रभाव को रद्द करने के लिए Promise.race का उपयोग करें:

 let cancel = () => {}; input.oninput = function(ev) { let term = ev.target.value; console.log(`searching for "${term}"`); cancel(); let p = new Promise(resolve => cancel = resolve); Promise.race([p, getSearchResults(term)]).then(results => { if (results) { console.log(`results for "${term}"`,results); } }); } function getSearchResults(term) { return new Promise(resolve => { let timeout = 100 + Math.floor(Math.random() * 1900); setTimeout(() => resolve([term.toLowerCase(), term.toUpperCase()]), timeout); }); } 
 Search: <input id="input"> 

मैंने मोज़िला जेएस संदर्भ को चेक किया है और इसे पाया है:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race

चलो पता करते हैं:

 var p1 = new Promise(function(resolve, reject) { setTimeout(resolve, 500, "one"); }); var p2 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, "two"); }); Promise.race([p1, p2]).then(function(value) { console.log(value); // "two" // Both resolve, but p2 is faster }); 

हमारे पास यहां पी 1 और पी 2 रखा गया है, Promise.race(...) किया है। Promise.race(...) तर्क के रूप में, यह वास्तव में नए संकल्प का वचन बना रहा है, जो आपके लिए जरूरी है।