Обещание поймать, как вернуть новое альтернативное обещание продолжить? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь получить () файл, и если он не работает, я хочу попробовать альтернативный файл.
Этот вложенный 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 голосов
/ 24 февраля 2019

Чтобы сделать его более СУХИМ, вы всегда можете использовать функцию.

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');
    });
0 голосов
/ 24 февраля 2019

Здесь нет ничего плохого во вложенных цепочках обещаний - они представляют желаемый поток управления.

Рассмотрим, как будет выглядеть код, если он написан с использованием синтаксиса 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() действительно более чист для этого варианта использования .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...