我正在尝试获取()文件,如果失败,我想尝试其他文件。
嵌套的Promise()感觉很脏。有什么更好的解决方案?
fetch('file1.csv')
.then(function(response){
if (response.status !== 200) {
throw 'file1 no 200 response';
}
return response;
})
.catch(function(){
return fetch('file2.csv')
.then(function(response){
if (response.status !== 200) {
throw 'file2 no 200 response';
}
return response;
})
})
.then(function(response){
console.log('got file1 or file2, continue... then() ...');
console.log(response);
})
.catch(function(err){
console.log('both files not found');
});
答案 0 :(得分:3)
要使其更干燥,您始终可以使用一个函数。
function getFile(name) {
return fetch(name)
.then(function (response) {
if (response.status !== 200) {
throw `${name} no 200 response`;
}
return response;
});
}
getFile('file1.csv')
.catch(function () {
return getFile('file2.csv');
})
.then(function (response) {
console.log('got file1 or file2, continue... then() ...');
console.log(response);
})
.catch(function (err) {
console.log('both files not found');
});
答案 1 :(得分:1)
这里的嵌套承诺链绝对没有错-它们代表了您想要的控制流。
考虑使用async
/ await
语法编写的代码的外观:
try {
var response;
try {
response = await fetch('file1.csv');
if (response.status !== 200) {
throw 'file1 no 200 response';
}
} catch(err) {
response = await fetch('file2.csv');
if (response.status !== 200) {
throw 'file2 no 200 response';
}
}
console.log('got file1 or file2:', response);
} catch(err) {
console.log('both files not found');
}
TBH,我认为.catch()
语法实际上更适合this use case。