承诺抓捕,如何返回新的替代承诺继续?

时间:2019-02-24 15:01:25

标签: javascript promise

我正在尝试获取()文件,如果失败,我想尝试其他文件。
嵌套的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');
    });

2 个答案:

答案 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