Promise.all powtorne ladowanie w promise.all

0

Zalozmy ze laduje sobie jakies pliki przez Promise.all i teraz jesli sie kilka nie zaladuje, to chcialbym zapisac te ktore sie zaladowaly w 1 tablicy a wszystkie errory chcialbym zapisac w 2giej tablicy i sprobowac je zaladowac ponownie. Kiedy sie wszystko zaladuje lub po 3 probach zwraca wynik a wiec mam cos takiego:

 async getOrdersBook(){
        let snapshoot = {};
        if(!this.isOrderBookPending)
        {
            this.isOrderBookPending = true;

            this.getSnapshootOrderBook(allowedArr) <--------------
                .then(result =>{
                    this.isOrderBookPending = false;
                    this.orderBook = result;
                })
                .catch(e => console.log("getOrdersBook error " + e))
            

            utils.logWithTime(" zwraca orderbook ")
        }

        return this.orderBook;
    }

    async getSnapshootOrderBook(tickersArr) <----------------
    {
       let fetchErrorPairs = [];
        let toValidateArr = []
        let prepareSnapshotArr = tickersArr;
        let count = 0;
        do{
            this.prepareSnapshootOrdersBook(prepareSnapshotArr) <-------------------
                .then(resultArr => {
                    fetchErrorPairs = [];
                    resultArr.forEach((element, index) => {
                        if(element.error)
                        {
                            fetchErrorPairs.push({symbol: element.pair});
                        }
                        else{
                            toValidateArr.push(element);
                        }
                    })
                    prepareSnapshotArr = fetchErrorPairs;
                    count++;
                    if(fetchErrorPairs.length = 0 || count > 2)
                        return toValidateArr;
                })



                

        }while(fetchErrorPairs.length > 0 || count > 3)
        
    }

    async prepareSnapshootOrdersBook(tickersArr) <-----------------
    {
        let promises = [];
        tickersArr.forEach(ele => {
            promises.push(this.getOrderBook(address))
        })

        return Promise.all(promises.map(p => p.catch(e =>
                console.log("some error :" + e)))).then(result => {
            return result;
        })

    }

Mozna cos takiego zrobic ? Zeby Promise.all staralo sie cos zaladowac 2-3 razy i zaladowane pliki gdzies zapisywalo i staralo sie powtorzyc ladowanie plikow, ktore nie chcialy sie zaladowac za 1szym razem i dopiero po kilku probach zwracalo wszystkie te ktore udalo sie zaladowaly za 1szym i 2gim razem?

0

Promise.all rzuca wyjątkiem przy pierwszym napotkanym wyjątku, więc musisz gdzieś wcześniej ja łapać  i zwracać np. { err: true } albo jakiegoś nulla.

Możesz zrobić po prosu wrapper, który będzie próbował X razy załadować plik, np. coś takiego:

async function loadFile(path) {
  if (Math.random() < 0.5) {
    throw 'load file err ' + path;
  }

 return { data: `file data ${path}`, err: null }
}

const MAX_RETRY = 3;
async function secureLoadFile(path, i = 0) {
   try {
      return await loadFile(path);
   } catch(err) {
     console.log(err, i);
     
     if (i >= 3) {
       return secureLoadFile(path, i + 1)
     }
​
     return { data: null, err }
​
   }
}

Promise.all([ secureLoadFile('a.txt'), secureLoadFile('b.txt'), secureLoadFile('c.txt'), secureLoadFile('d.txt')  ]) // i tutaj już sobie możesz przefiltrować załadowane pliki

1 użytkowników online, w tym zalogowanych: 0, gości: 1