दिलचस्प पोस्ट
रूबी में एक निर्देशिका से सभी फाइलों की आवश्यकता का सबसे अच्छा तरीका है? सी # जावा HashMap समकक्ष file.delete () भले ही file.exists (), file.canRead (), file.canWrite (), file.canExecute () सभी रिटर्न सच भी गलत रिटर्न मैं MySQL का समय क्षेत्र कैसे सेट करूं? कैसे खोज_पथ प्रभाव पहचानकर्ता संकल्प और "वर्तमान स्कीमा" एंड्रॉइड में इनकमिंग कॉल को अस्वीकार करना ITextSharp का उपयोग करते हुए मैं एक एक्सएफए पीडीएफ फॉर्म कैसे बदल सकता हूं? Java.util.Scanner का उपयोग करके इनपुट की पुष्टि करना मौजूदा iPhone इनपुट भाषा का पता लगा रहा है डाटा बाध्यकारी गतिशील डेटा जिक्र का इस्तेमाल करते हुए तत्काल बाल डिवी तत्वों को गिनाएं ByteBuffer.allocate () बनाम ByteBuffer.allocateDirect () समान टेम्पलेट में एंगल 2 एकाधिक रूटर-आउटलेट Google Analytics GIF अनुरोध भेजा नहीं गया लूप का उपयोग किए बिना गिनती में सरणी के अनुसार समूह कैसे करें

मैं मूल XHR का प्रचार कैसे करूं?

मैं XHR अनुरोध करने के लिए अपने सामने वाला ऐप में (देशी) वादों का उपयोग करना चाहता हूं लेकिन बिना किसी बड़े ढांचे के सभी कथनों के लिए उपयोग करना चाहता हूं

मैं चाहता हूं कि मेरा एक्सहोर वादा करे, लेकिन यह काम नहीं करता है (मुझे दे रहा है: Uncaught TypeError: Promise resolver undefined is not a function )

 function makeXHRRequest (method, url, done) { var xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onload = function() { return new Promise().resolve(); }; xhr.onerror = function() { return new Promise().reject(); }; xhr.send(); } makeXHRRequest('GET', 'http://example.com') .then(function (datums) { console.log(datums); }); 

Solutions Collecting From Web of "मैं मूल XHR का प्रचार कैसे करूं?"

मैं मान रहा हूँ कि आप एक देशी एक्सएचआर अनुरोध कैसे करें (आप यहाँ और यहां ब्रश कर सकते हैं )

चूंकि किसी भी ब्राउज़र से जो मूल वादे का समर्थन करता है, वह भी xhr.onload समर्थन xhr.onload , हम सभी onReadyStateChange tomfoolery को छोड़ सकते हैं। चलो एक कदम वापस लेते हैं और कॉलबैक का उपयोग करके मूल XHR अनुरोध फ़ंक्शन से शुरू करते हैं:

 function makeRequest (method, url, done) { var xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onload = function () { done(null, xhr.response); }; xhr.onerror = function () { done(xhr.response); }; xhr.send(); } // And we'd call it as such: makeRequest('GET', 'http://example.com', function (err, datums) { if (err) { throw err; } console.log(datums); }); 

हुर्रे! इसमें बहुत जटिल चीज़ों (कस्टम हेडर या पोस्ट डेटा) को शामिल नहीं किया गया है, लेकिन हमें आगे बढ़ने के लिए पर्याप्त है।

वादा निर्माता

हम ऐसा वादा कर सकते हैं जैसे:

 new Promise(function (resolve, reject) { // Do some Async stuff // call resolve if it succeeded // reject if it failed }); 

वादा निर्माता एक ऐसा कार्य लेता है जिसे दो तर्कों को पारित किया जाएगा (चलो उन्हें resolve और reject )। आप कॉलबैक के रूप में इन के बारे में सोच सकते हैं, एक सफलता के लिए और एक विफलता के लिए। उदाहरण भयानक हैं, इस निर्माता के साथ makeRequest अपडेट करें:

 function makeRequest (method, url) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onload = function () { if (this.status >= 200 && this.status < 300) { resolve(xhr.response); } else { reject({ status: this.status, statusText: xhr.statusText }); } }; xhr.onerror = function () { reject({ status: this.status, statusText: xhr.statusText }); }; xhr.send(); }); } // Example: makeRequest('GET', 'http://example.com') .then(function (datums) { console.log(datums); }) .catch(function (err) { console.error('Augh, there was an error!', err.statusText); }); 

अब हम कई एक्सएचआर कॉल्स (और। को .catch किसी भी कॉल पर त्रुटि के लिए ट्रिगर कर सकते हैं) वादे की शक्ति में टैप कर सकते हैं:

 makeRequest('GET', 'http://example.com') .then(function (datums) { return makeRequest('GET', datums.url); }) .then(function (moreDatums) { console.log(moreDatums); }) .catch(function (err) { console.error('Augh, there was an error!', err.statusText); }); 

हम इसे अभी भी आगे बढ़ा सकते हैं, पोस्ट / पीयूटी पैराम्स और कस्टम हेडर दोनों को जोड़ सकते हैं। हस्ताक्षर के साथ, बहुल तर्कों के बजाय एक विकल्प ऑब्जेक्ट का उपयोग करते हैं:

 { method: String, url: String, params: String | Object, headers: Object } 

makeRequest अब ऐसा कुछ दिखता है:

 function makeRequest (opts) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(opts.method, opts.url); xhr.onload = function () { if (this.status >= 200 && this.status < 300) { resolve(xhr.response); } else { reject({ status: this.status, statusText: xhr.statusText }); } }; xhr.onerror = function () { reject({ status: this.status, statusText: xhr.statusText }); }; if (opts.headers) { Object.keys(opts.headers).forEach(function (key) { xhr.setRequestHeader(key, opts.headers[key]); }); } var params = opts.params; // We'll need to stringify if we've been given an object // If we have a string, this is skipped. if (params && typeof params === 'object') { params = Object.keys(params).map(function (key) { return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]); }).join('&'); } xhr.send(params); }); } // Headers and params are optional makeRequest({ method: 'GET', url: 'http://example.com' }) .then(function (datums) { return makeRequest({ method: 'POST', url: datums.url, params: { score: 9001 }, headers: { 'X-Subliminal-Message': 'Upvote-this-answer' } }); }) .catch(function (err) { console.error('Augh, there was an error!', err.statusText); }); 

एमडीएन में एक अधिक व्यापक दृष्टिकोण पाया जा सकता है

वैकल्पिक रूप से, आप फ़ेच एपीआई ( पॉलीफिल ) का उपयोग कर सकते हैं

यह निम्न कोड के रूप में सरल हो सकता है

ध्यान रखें कि यह कोड केवल कॉलबैक को reject करेगा जब onerror (केवल नेटवर्क त्रुटियाँ) कहा जाता है और नहीं जब HTTP स्थिति कोड एक त्रुटि का प्रतीक है यह अन्य सभी अपवादों को भी बाहर करेगा। उनसे निपटना आपके ऊपर होना चाहिए, आईएमओ।

इसके अतिरिक्त, इसे कॉलबैक को reject करने के लिए reject करने के लिए सिफारिश की जाती है, न कि ईवेंट का, बल्कि सादगी के लिए, जैसा मैंने दिया है

 function request(method, url) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open(method, url); xhr.onload = resolve; xhr.onerror = reject; xhr.send(); }); } 

और इसे लागू किया जा सकता है यह:

 request('GET', 'http://google.com') .then(function (e) { console.log(e.target.response); }, function (e) { // handle errors }); 

जो भी इस के लिए खोज करता है, उसके लिए आप फ़ेच फ़ंक्शन का उपयोग कर सकते हैं। इसमें कुछ बहुत अच्छा समर्थन है

मैंने सबसे पहले कुछ केट्स के जवाब का उपयोग किया है, लेकिन फिर खोज की खोज की जो मेरे लिए बॉक्स से बाहर निकलती है 🙂

मुझे लगता है कि हम शीर्ष उत्तर को अधिक लचीला बना सकते हैं और इसे XMLHttpRequest ऑब्जेक्ट नहीं बनाकर पुन: उपयोग कर सकते हैं ऐसा करने का एकमात्र फायदा यह है कि हमें यह करने के लिए खुद को 2 या 3 लाइन कोड लिखने की ज़रूरत नहीं है, और इसकी कई एपीआई सुविधाओं की पहुंच को दूर करने की भारी खामी है, जैसे हेडर सेट करना यह उस कोड से मूल वस्तु की संपत्ति को छुपाता है जो प्रतिसाद को संभालना माना जाता है (सफलताओं और त्रुटियों दोनों के लिए) इसलिए हम XMLHttpRequest ऑब्जेक्ट को केवल परिणाम के रूप में गुजरने के रूप में इनपुट के रूप में स्वीकार करते हुए अधिक लचीला, अधिक व्यापक रूप से लागू किए गए फ़ंक्शन बना सकते हैं।

यह फ़ंक्शन किसी मनमानी XMLHttpRequest ऑब्जेक्ट को वादा करता है, गैर-200 स्थिति कोड को डिफ़ॉल्ट रूप से एक त्रुटि के रूप में इलाज कर रहा है:

 function promiseResponse(xhr, failNon2xx = true) { return new Promise(function (resolve, reject) { // Note that when we call reject, we pass an object // with the request as a property. This makes it easy for // catch blocks to distinguish errors arising here // from errors arising elsewhere. Suggestions on a // cleaner way to allow that are welcome. xhr.onload = function () { if (failNon2xx && (xhr.status < 200 || xhr.status >= 300)) { reject({request: xhr}); } else { resolve(xhr); } }; xhr.onerror = function () { reject({request: xhr}); }; xhr.send(); }); } 

XMLHttpRequest एपीआई की लचीलेपन के बगैर, यह समारोह बहुत स्वाभाविक रूप से Promise श्रृंखला में फिट बैठता है:

 Promise.resolve() .then(function() { // We make this a separate function to avoid // polluting the calling scope. var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://stackoverflow.com/'); return xhr; }) .then(promiseResponse) .then(function(request) { console.log('Success'); console.log(request.status + ' ' + request.statusText); }); 

नमूना कोड को सरल रखने के लिए catch ऊपर छोड़ दिया गया था आपके पास हमेशा एक होना चाहिए, और निश्चित रूप से हम यह कर सकते हैं:

 Promise.resolve() .then(function() { var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://stackoverflow.com/doesnotexist'); return xhr; }) .then(promiseResponse) .catch(function(err) { console.log('Error'); if (err.hasOwnProperty('request')) { console.log(err.request.status + ' ' + err.request.statusText); } else { console.log(err); } }); 

और HTTP स्थिति कोड हैंडलिंग को निष्क्रिय करने के लिए कोड में बहुत बदलाव की आवश्यकता नहीं है:

 Promise.resolve() .then(function() { var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://stackoverflow.com/doesnotexist'); return xhr; }) .then(function(xhr) { return promiseResponse(xhr, false); }) .then(function(request) { console.log('Done'); console.log(request.status + ' ' + request.statusText); }); 

हमारा कॉलिंग कोड लंबा है, लेकिन अवधारणा है, यह समझना अभी भी आसान है कि क्या हो रहा है। और हमें इसकी विशेषताओं का समर्थन करने के लिए संपूर्ण वेब अनुरोध एपीआई को फिर से बनाने की ज़रूरत नहीं है

हम अपने कोड को व्यवस्थित करने के लिए कुछ सुविधा कार्य भी जोड़ सकते हैं, साथ ही:

 function makeSimpleGet(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url); return xhr; } function promiseResponseAnyCode(xhr) { return promiseResponse(xhr, false); } 

तो हमारा कोड बन जाता है:

 Promise.resolve(makeSimpleGet('https://stackoverflow.com/doesnotexist')) .then(promiseResponseAnyCode) .then(function(request) { console.log('Done'); console.log(request.status + ' ' + request.statusText); });