web-dev-qa-db-de.com

axios.all verbreiten und fangen alle

Ich verwende alle Methoden der beliebten Bibliothek 'axios' zur Bearbeitung meiner Ajax-Anfragen.

Aber wie kann ich mit Fehlern umgehen, wenn alle Anfragen 404 erhalten haben?

zum Beispiel:

axios.all([
        axios.get('http://some_url'),
        axios.get('http://another_url'),
      ])
        .then(axios.spread((someUrl, anotherUrl) => {
         // ... boring stuff goes there
        }))
        .catch(() => {
         //... error goes there
        });

 enter image description here

Also scheint nur ein Fehler "gefangen" worden zu sein.

Wie kann ich sie alle fangen? Oder vielleicht irgend etwas.

5
WebArtisan

Das Problem (wie Sie bereits wissen) ist, dass Sie in den catch-Block gelangen, sobald das erste Versprechen abgelehnt wird. Dadurch ist es unmöglich, alle fehlgeschlagenen Antworten in derselben catch zu sammeln. Sie können fehlgeschlagene Zusagen jedoch weiterhin manuell bearbeiten, um Fehler zu sammeln und anschließend zu werfen. 

Prüfen Sie, ob dies für Sie funktioniert:

const promises = [
  axios.get('http://some_url'),
  axios.get('http://another_url'),
]
const promisesResolved = promises.map(promise => promise.catch(error => ({ error })))

function checkFailed (then) {
  return function (responses) {
    const someFailed = responses.some(response => response.error)

    if (someFailed) {
      throw responses
    }

    return then(responses)
  }
}

axios.all(promisesResolved)
  .then(checkFailed(([someUrl, anotherUrl]) => {
    console.log('SUCCESS', someUrl, anotherUrl)
  }))
  .catch((err) => {
    console.log('FAIL', err)
  });

Sie gelangen in den catch-Block, wenn mindestens eines der Zusagen fehlschlägt. Sie können eine davon finden, indem Sie das err-Array der Antworten markieren.

5
dfsq

Ich glaube nicht, dass dies aufgrund des ausfallsicheren Verhaltens von Promise.all möglich ist. Wenn eine Ihrer Anfragen fehlschlägt, sind sie automatisch der Täter und das Ergebnis im Fang.

    Promise.all([
      Promise.reject(Error('1')),
      Promise.reject(Error('2')),
      Promise.reject(Error('3'))
    ]).then((results) => {
      console.log(results)
    }, (error) => {
      console.log(error.message)
    })

Dieser resultierende Code wird immer 1 drucken, da er als erster fehlschlägt. Ich denke, ein ähnliches Feature wurde für das Repo angefordert und sie sagten, es sei nicht möglich.

Ich würde dies als Kommentar hinterlassen, habe aber noch keinen guten Ruf.

1
Charlie