एक Promise.all पकड़ने नहीं त्रुटि में लाने में नाकाम रहने के

वोट
1

मैं लोड करने के लिए कई JSON है और यदि उन सभी को अच्छी तरह से लाई जाती हैं, जांच करना चाहिए। इसलिए मैं सभी के लिए प्रतीक्षा करने के लिए एक Promise.all का उपयोग fetch

पहले valid.jsonसे मौजूद है, नहीं एक दूसरे, इसलिए दूसरा fetchएक 404. साथ लेकिन बावजूद समाप्त हो जाती है Promise.reject, Promise.allअभी भी लॉग Success!पिछले त्रुटि फेंकने की बजाय।

वहाँ कुछ मैं कैसे के बारे में याद किया जाता है Promise.allकाम करता है?

const json_pathes = [
    'valid.json',
    'not_valid.json'
];

function check_errors(response) {
    if (!response.ok) {
        Promise.reject('Error while fetching data');
        throw Error(response.statusText + ' (' + response.url + ')');
    }
    return response;
}

Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(check_errors)
        .then(response => response.json())
        .catch(error => console.log(error))
))
.then(data => {
    console.log('Success!', data);
})
.catch(reason => {
    throw Error(reason);
});

// Console:
// Error: Not Found (not_valid.json)
// uncaught exception: Error while fetching data
// Array [ […], undefined ]

(पाठ्यक्रम के सभी इसी तरह के सवाल की जांच की गई, लेकिन कुछ भी मदद की 😕)


संपादित करें - जवाब नीचे के बाद फिक्स्ड कोड:

const json_pathes = […]
Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(response => {
            if (!response.ok)
                throw Error(response.statusText + ' (' + response.url + ')');
            return response;
        })
        .then(response => response.json())
        .catch(error => {
            throw error;
        })
))
.then(data => {
    // Success
})
.catch(error => {
    throw error;
});
02/12/2019 को 23:57
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

इस कॉल:

 .catch(error => console.log(error))

... एक पूरा वादा, नहीं एक को अस्वीकार कर दिया एक वापस आ जाएगी। जब भी आप एक अस्वीकृति का इलाज और आप एक अस्वीकृति के रूप में बुलबुला अप करने के लिए यह चाहते हैं, आप स्पष्ट रूप से वह क्या करना चाहिए:

 .catch(error => {
       console.log(error);
       throw error; // cascade...
 })

वैसे, यह सब पर कोई प्रभाव नहीं है

 Promise.reject('Error while fetching data');

... तो आप इस नव निर्मित, अस्वीकार कर दिया वादे के साथ कुछ भी नहीं करते हैं।

03/12/2019 को 00:02
का स्रोत उपयोगकर्ता

वोट
1

आप जब आप .catch () विधि का उपयोग त्रुटि फिर से फेंकने के लिए है, या त्रुटि म्यूट कर दिया जाएगा

Promise.all(
  json_paths.map(url => 
    fetch(url)
      .then(response => response.json())
      .catch(err => {
        console.log(err);
        throw err
      })
  )
).then(data => {
  // all promise resolved
  console.log(data)
}).catch(err => {
  // some promise may not be resolved
  console.log(err)
})

03/12/2019 को 00:05
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more