2017-01-04 10 views
5

पकड़ें मैं कुछ एपीआई कॉल को प्रतिक्रिया-मूल में बनाने के लिए fetch का उपयोग कर रहा हूं, कभी-कभी यादृच्छिक रूप से fetch सर्वर को अनुरोध नहीं करता है और मेरे बाद या ब्लॉक को छोड़कर नहीं कहा जाता है। यह यादृच्छिक रूप से होता है, मुझे लगता है कि दौड़ की स्थिति या कुछ समान हो सकता है। एक बार अनुरोधों को विफल करने के बाद, ऐप को फिर से लोड करने तक एक ही एपीआई के अनुरोध कभी नहीं निकाल दिए जाते हैं। किसी भी विचार इस के पीछे कारण का पता लगाने के लिए कैसे। मेरे द्वारा उपयोग किया गया कोड नीचे है।देशी फ़ेच को प्रतिक्रिया दें या फिर

const host = liveBaseHost; 
const url = `${host}${route}?observer_id=${user._id}`; 
let options = Object.assign({ 
     method: verb 
    }, params 
    ? { 
     body: JSON.stringify(params) 
    } 
    : null); 
options.headers = NimbusApi.headers(user) 
return fetch(url, options).then(resp => { 
    let json = resp.json(); 
    if (resp.ok) { 
     return json 
    } 
    return json.then(err => { 
     throw err 
    }); 
}).then(json => json); 
+0

इस तरह कैच ब्लॉक जोड़ने का प्रयास करें: .catch (error => त्रुटि) –

+0

क्या यह केवल तब होता है जब क्रोम में डिबगिंग होती है? यदि ऐसा है, तो मैं [इस मुद्दे] से संबंधित हो सकता हूं (https://github.com/facebook/react-native/issues/6679)। 'SetTimeout (() => null, 0) जोड़ने का प्रयास करें;' 'resp.json()' से पहले। – ncuillery

+0

@ncuillery आपकी प्रतिक्रिया के लिए धन्यवाद, यह केवल क्रोम में नहीं हो रहा है, यह ऐप के टेस्ट बिल्ड में भी होता है। मैंने आपके द्वारा उल्लेखित मुद्दे को देखा है, लेकिन मेरा थोड़ा अलग था। उस मुद्दे में resp, json() विधि ब्लॉक लेकिन मेरे मामले में, तब ब्लॉक को कभी निष्पादित नहीं किया जाता है, भले ही fetch विधि को कई बार कहा जाता है। –

उत्तर

3

प्राप्त करें एक त्रुटि फेंक सकता है और आपने पकड़ ब्लॉक नहीं जोड़ा है। इस प्रयास करें:

return fetch(url, options) 
    .then((resp) => { 
    if (resp.ok) { 
     return resp.json() 
     .then((responseData) => { 
      return responseData; 
     }); 
    } 
    return resp.json() 
     .then((error) => { 
     return Promise.reject(error); 
     }); 
    }) 
    .catch(err => {/* catch the error here */}); 

याद रखें कि आम तौर पर इस प्रारूप है वादा किया:

promise(params) 
    .then(resp => { /* This callback is called is promise is resolved */ }, 
     cause => {/* This callback is called if primise is rejected */}) 
    .catch(error => { /* This callback is called if an unmanaged error is thrown */ }); 

मैं इसे उपयोग कर रहा हूँ इस तरह से है क्योंकि मैं एक ही समस्या से पहले का सामना करना पड़ा।

मुझे बताएं कि यह आपकी मदद करता है या नहीं।

+1

आपके उत्तर के लिए धन्यवाद, असल में मैं इस विधि से वादा वापस कर देता हूं और इसे कॉल करने वाली दूसरी विधि में मेरे पास एक पकड़ ब्लॉक है, जिसे कभी निष्पादित नहीं किया जाता है। –

+0

क्या आपने यह देखने के लिए डीबग करने का प्रयास किया था कि त्रुटि कहां डाली जा रही है (या यह देखने के लिए कि यह कहां रुक रहा है)? क्या आपको कंसोल में कोई त्रुटि दिखाई दे रही है (यदि आपके पास है तो उन्हें संलग्न करें)? –

+0

मुझे कोई त्रुटि नहीं फेंक रही है और कंसोल में कोई त्रुटि नहीं है, यह बहुत अजीब है। –

0

एक कोशिश पकड़ में अपने fetch लपेटें:

let res; 
try { 
    res = fetch(); 
} catch(err) { 
    console.error('err.message:', err.message); 
} 

आप देख रहे हैं, तो "नेटवर्क विफलता त्रुटि" यह या तो CORS या वास्तव में अजीब है, लेकिन यह मुझे अतीत में मिला, जांच करें कि आपने हवाई जहाज मोड में नहीं हैं।

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