2016-04-05 6 views
3

Es folgt ein Beispiel:In der Promise von Javascript, warum kann der Fehler nicht an die nächste Kette `.catch()` weitergegeben werden?

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    return error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

Das Ergebnis für die Codes sind:

Error: test 1 

Wie zu sehen ist, wird der zweite catch Anruf nicht. Bedeutet das, dass Promise Fehler nicht mit der Kettensyntax von catch behandeln kann? Gibt es eine Möglichkeit, den aktuellen Fehler zum nächsten catch() Aufruf zu übergeben?

+3

Sie wiederholen den Fehler nie erneut. Warum sollte ein Rückgabewert als Fehler angesehen werden? Verwenden Sie 'throw error;' stattdessen und Sie sollten das erwartete Verhalten erhalten. – Luaan

+0

Mögliches Duplikat von http://stackoverflow.com/questions/35042068/why-is-onwiedergegeben-not-called-following-promise-all-where-promise-reject-incl – guest271314

+0

Wenn Sie * etwas * von 'fangen' zurückbringen , Sie sagen, dass Sie das Problem behandelt haben, und dies ist der Wert, um damit fortzufahren. Wenn Sie das Problem nicht behoben haben, * wiederholen * und nicht zurück. –

Antwort

7

Wenn der Fehler zurückgegeben wird, wird die nächste catch nicht ausgelöst. Sie müssen wieder den Fehler throw:

promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    throw error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 
-> Error: test 1 
-> Error: test 2 
3

Sie haben wieder den Fehler zu werfen, im Gegensatz zu nur einen Fehler Objekt Rückkehr:

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    throw error 
}).catch(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

js hat keinen internen Begriff „diese ist ein Fehlerobjekt, also werfen Sie es "- wenn es eine then() Klausel nach Ihrem ersten catch() gegeben hätte, wäre der Vorgang darauf zurückgestellt worden, so:

var promise = new Promise(function(resolve, reject) { 
    throw new Error('test'); 
}); 
promise.catch(function(error) { 
    console.log(error + ' 1 '); 
    return error 
}).then(function(error) { 
    console.log(error + ' 2 '); 
    return error 
}) 

Hoffe, das hilft!

+0

Ich frage mich, was "das ist ein Fehler Objekt so werfen" -Funktion würde aussehen oder sogar was es bedeuten würde. –

+0

@ T.J.Crowder Ich habe meine Formulierung so gelöscht, ich bin gunna löschen alle meine Kommentare aufzuräumen die Antwort :) –

Verwandte Themen