Игнорирование невыполненных обещаний в Promoise.all - PullRequest
0 голосов
/ 03 ноября 2019

Я получаю URL-адреса, указанные в массиве, а затем объединяю полученные результаты. Я хочу игнорировать неудачные выборки.

Хотя тонны сообщений по теме:

  1. Подождите, пока все обещания не будут выполнены, даже если некоторые отклонят
  2. https://gist.github.com/nhagen/a1d36b39977822c224b8

Я просто не могу понять, как применить это к моему коду, который выбирает URL-адреса из массива:

    Promise.all (arrayOfBlobs.map (x => fetch (x).then (response => response.json())) )         
    .then (json => {
                json.forEach ( x => { 
                    if (Array.isArray (x)) {
                        // this json has array of objects
                        console.log (`Received ${x.length} prospects`)
                        x.forEach ( y => combinedArray.push (y) )   
                    }   
                    else {
                        // this json has single prospect object
                        console.log (`Received single prospect`)
                        combinedArray.push (x)
                    }
                })
        this.setState({loadingTable: false, data: combinedArray})
    })  
    .catch (error => {
        console.error (error.message)
        this.setState({loadingTable: false, data: combinedArray})
    })

Например, ниже не сделалработа:

Promise.all (arrayOfBlobs.map (x => fetch (x).then (response => response.json())) )         
            .then (json => {
                        json.forEach ( x => { 
                            if (Array.isArray (x)) {
                                // this json has array of objects
                                console.log (`Received ${x.length} prospects`)
                                x.forEach ( y => combinedArray.push (y) )   
                            }   
                            else {
                                // this json has single prospect object
                                console.log (`Received single prospect`)
                                combinedArray.push (x)
                            }
                        })
                        .catch (e => {console.log (`Failed to fetch due to ${e.message}`)})
                this.setState({loadingTable: false, data: combinedArray})
            })  
            .catch (error => {
                console.error (error.message)
                this.setState({loadingTable: false, data: combinedArray})
            })

Что мне нужно сделать, чтобы изменить мой код, чтобы неудачные выборки игнорировались?

Ответы [ 3 ]

3 голосов
/ 03 ноября 2019

Использование Promise.allSettled() возвращает значение выполненного / отклоненного со значением.

Дополнительная информация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

1 голос
/ 03 ноября 2019

Предполагается, что catch будет выполняться для отдельного обещания fetch внутри map:

Promise.all(arrayOfBlobs.map(x =>
    fetch(x)
    .then(response => response.json())
    .catch(e => {
//  ^^^^^^^
        console.log(`Failed to fetch due to ${e.message}`);
        return null; // this value will get into the `json` array
    })
))         
.then(json => {
    const combinedArray = [];
    for (const x in json) { 
        if (Array.isArray(x)) {
            // this json has array of objects
            console.log (`Received ${x.length} prospects`)
            combinedArray.push(...x);
        } else if (x != null) {
            // this json has single prospect object
            console.log (`Received single prospect`)
            combinedArray.push(x)
        } else { // x == null
            console.log(`(ignored error)`)
        })
    }
    this.setState({loadingTable: false, data: combinedArray})
})

Также не забудьте обработать ошибки http (кода состояния) !

0 голосов
/ 03 ноября 2019

Версия Promise.allSettled, которая удаляет отклоненные результаты:

function allFullfilled(promises) {

  const responses = [];
  let settledCount = 0;

  return new Promise(res => {

    for(const promise of promises) {

      promise
        .then( promiseResult => {
          responses.push(promiseResult);
        })
        .catch(err => {
          // ignore
        })
        .then( () => {
          settledCount++;
          if (settledCount === promises.length) {
            res(responses);
          }
        });
    }

  });

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