2015-09-22 8 views
21

जब एपीआई लाने जावास्क्रिप्ट के साथ एक सर्वर से अनुरोध कर रहा है, तो आप की तरहजावास्क्रिप्ट fetch API से प्रतिक्रिया ऑब्जेक्ट एक वादा क्यों है?

fetch(API) 
    .then(response => response.json()) 
    .catch(err => console.log(err)) 

यहाँ कुछ करने के लिए, response.json() अपने वादे को हल किया गया है।

बात यह है कि यदि आप 404 की त्रुटियों को पकड़ना चाहते हैं, तो आपको प्रतिक्रिया वादे को हल करना होगा और फिर लाने का वादा अस्वीकार करना होगा, क्योंकि यदि नेटवर्क त्रुटि हो तो आप केवल catch में समाप्त हो जाएंगे। तो fetch कॉल

fetch(API) 
    .then(response => response.ok ? response.json() : response.json().then(err => Promise.reject(err))) 
    .catch(err => console.log(err)) 

कुछ ऐसा कुछ कठिन और पढ़ने के लिए कठिन है। तो मेरा सवाल है: इसकी आवश्यकता क्यों है? प्रतिक्रिया मूल्य के रूप में वादा करने का क्या मतलब है? क्या इसे संभालने के लिए कोई बेहतर तरीका है?

+4

प्रतिक्रिया वस्तु एक वादा नहीं है। यह एक प्रतिक्रिया है, 'जेसन' (और दूसरों के बीच एक तरीका जो वादा करता है। क्या आपका सवाल है कि 'जेसन()' एक वादा क्यों देता है? –

+1

बिल्कुल एक डुप्लिकेट नहीं है, लेकिन आप [यहां] देखना चाहते हैं (http: //stackoverflow.com/a/32516463/3887516) – Amit

+0

क्या आपको वास्तव में 404 प्रतिक्रिया की सामग्री की आपकी आवश्यकता के रूप में आवश्यकता है? यदि नहीं, तो आप जो चाहते हैं उसे हासिल करने के सरल तरीके हैं। यदि आप करते हैं, तो मुझे कुछ भी दिखाई नहीं देता 'fetch' कैसे काम करता है के साथ गलत। – Bergi

उत्तर

15

यदि आपका प्रश्न है "response.json() क्यों एक वादा वापस करता है?" तो @ बर्गि टिप्पणियों में सुराग प्रदान करता है: "यह शरीर को लोड करने की प्रतीक्षा करता है"।

यदि आपका प्रश्न है "response.json एक विशेषता क्यों नहीं है?", तो उसमें fetch की आवश्यकता होगी ताकि शरीर को लोड होने तक इसकी प्रतिक्रिया वापस करने में देरी हो, जो कि कुछ के लिए ठीक हो सकता है, लेकिन सभी नहीं।

यह polyfill आप क्या चाहते हैं आप मिलना चाहिए:

var fetchOk = api => fetch(api) 
    .then(res => res.ok ? res : res.json().then(err => Promise.reject(err))); 

तो आप कर सकते हैं:

fetchOk(API) 
    .then(response => response.json()) 
    .catch(err => console.log(err)); 

रिवर्स polyfilled नहीं किया जा सकता।

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