javascript - Kode kjører fortsatt etter return-setningen i catch?


console.log('1');
await get()
    .then()
    .catch(() => {
        console.log('2');

        return;
    });
console.log('3');

Hvorfor logget konsollen 1 2 3? Jeg trodde etter return-setningen vil ikke koden bli utført?

Svar #1

return vil bare avslutte den nåværende funksjonen. Her er funksjonen som blir avsluttet av return .catch-tilbakekallingen.

Siden .catch returnerer et oppfylt løfte, vil den awaitede løftekjeden bli oppfylt når catch blir oppfylt.

Hvis du vil stoppe ytre funksjon når catch kjører, la din catch returnere noe som du sjekker utenfor, f.eks:

(async() => {
  console.log('1');
  const result = await Promise.reject()
    .catch(() => {
      console.log('2');

      return 2;
    });
  if (result === 2) {
    return;
  }
  console.log('3');
})();

Eller la .catch kaste en feil, slik at den ytre Promise-kjeden avvises. Siden det blir awaitet, vil hele den ytre Promise da avvises:

const fn = async () => {
  console.log('1');
  const result = await Promise.reject()
    .catch(() => {
      console.log('2');
      throw new Error();
    });
  console.log('3');
};

fn()
  .then(() => console.log('resolved'))
  .catch(() => console.log('rejected'))

Hvis din .catch ikke gjør noe vesentlig, men du ønsker denne typen oppførsel, er det vanligvis en god idé å utelate den helt. På den måten, når det oppstår en feil, vil den awaitede Promise bli avvist, funksjonen vil avsluttes, og feilen kan fanges av den aktuelle forbrukeren.

const fn = async () => {
  console.log('1');
  const result = await Promise.reject();
  console.log('3');
};

fn()
  .then(() => console.log('resolved'))
  .catch(() => console.log('rejected'))

Svar #2

Det er fordi returverdien er i en egen funksjon (catch-håndtereren).

Returneringen gjelder bare for funksjonen den er inne i. Den vil ikke påvirke det ytre området.

Relaterte artikler