2016-04-23 20 views
6

Ecco il codice in questione:"Uncaught (nella promessa)" quando si chiama la funzione di scarto all'interno di un metodo prendere 'poi'

new Promise((resolve, reject) => { 
    const opts = { 
    credentials: 'same-origin', 
    }; 

    fetch(`/_api/myAPI`, opts) 
    .then((res) => { 
    if (!res.ok) { 
     reject(res); 
    } else { 
     ... 

Se l'URL genera un'eccezione a 401, quando l'esecuzione raggiunge reject(res); getta Uncaught (in promise)

Anche dopo aggiungo un .catch dopo la chiamata .then, cioè

fetch(`/_api/myAPI`, opts) 
    .then((res) => { 
    if (!res.ok) { 
     reject(res); 
    } else { 
     ... 
    }) 
    .catch((e) => { 
    console.log(e); 
    } 

succede ancora.

Perché reject genera questa eccezione e come posso risolverlo? La mia esperienza è limitata a jQuery.Promise e io non un reject all'interno di un gestore di errori attiverà questo errore.

+2

Wrapping recuperare promessa in una nuova promessa è [un antipattern] (http://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do -i-evitare-it). E causa qui effetti negativi. – estus

+0

@estus Grazie per il commento informativo! –

risposta

9

Quando si rifiuta la promessa, si rifiuta immediatamente la promessa che sta avvolgendo l'intera operazione, in modo da non arrivare mai a quel blocco.

Un'analogia: il rifiuto e la risoluzione sono le promesse come ritorno alle funzioni.

Penso che quello che stai cercando di fare è il codice qui sotto.

new Promise((resolve, reject) => { 
    const opts = { 
    credentials: 'same-origin', 
    }; 
    fetch(`/_api/myAPI`, opts) 
    .then((res) => { 
    if (!res.ok) { 
     return Promise.reject() 
    } else { 
     ... 
     resolve(...); 
    }) 
    .catch((e) => { 
    console.log(e); 
    reject(); 
    } 
} 
+0

So che questo thread è obsoleto ma è possibile che, almeno in Chrome, * sempre * visualizzi quell'errore quando rifiuta una promessa? Penso che sia quello che sto vedendo. L'ho provato con un non promettere nulla che respinge immediatamente e ha ancora ottenuto l'errore. Qualcun altro vede questo comportamento? –

+0

Credo che tu abbia ragione pure. il mio codice raggiunge la presa e ho provato entrambi a lanciare un errore e solo promise.reject(). entrambi lo mostrano in chrome per me. –

Problemi correlati