2017-09-01 1 views
2

I für die Verwendung von fetch mit CouchDB eine Hilfsfunktion haben, die als beendet:Wie ein Promise.reject .catch

... 
return fetch(...) 
    .then(resp => resp.ok ? resp.json() : Promise.reject(resp)) 
    .then(json => json.error ? Promise.reject(json) : json) 

und wenn ich es an anderer Stelle verwenden, ich hatte den Eindruck, dass ich konnte .catch ausdrücklich diejenigen Zurückweisungen:

aber leider kann ich nicht in der Lage sein, die Ablehnungen zu bekommen. Der spezifische Fehler, nach dem ich suche, ist eine HTTP 401-Antwort.

Was gibt?

(Bitte beachten Sie, dass es implizite ES6 return ‚s in den .then s)

+0

Ich wollte user @ jfriend00 Kommentar, aber der Kommentar verschwunden upvote. :( – morbusg

Antwort

7

function test() { 
 
     return new Promise((resolve, reject) => { 
 
     return reject('rejected') 
 
     }) 
 
    } 
 

 
    test().then(function() { 
 
     //here when you resolve 
 
    }) 
 
    .catch(function(rej) { 
 
     //here when you reject the promise 
 
     console.log(rej); 
 
    });

+0

Sie haben Recht, ich stimme zu. – yBrodsky

+1

Also ich denke, es macht meine Frage eine xy Frage, ich hasse wenn das passiert. – morbusg

0

Versprechen Ablehnungen auf den zweiten param der then Funktion fallen.

function test() { 
    return new Promise((resolve, reject) => { 
    return reject('rejected') 
    }) 
} 

test().then(function() { 
    //here when you resolve 
}, function(rej) { 
    //here when you reject the promise 
    console.log(rej) 
}) 
+1

Die catch() -Methode gibt eine Promise zurück und behandelt nur abgelehnte Fälle. Sie verhält sich genauso wie Promise.prototype.then (undefined, onRejected) (der Aufruf von obj.catch (onRejected) ruft intern obj.then auf) (undefined, onRejected)) – ivo

+1

Ich habe viele Dokumente gelesen, die behaupten, dass jeder diesen Stil meiden sollte, da er die "linke" Seite nicht finden kann, und stattdessen den '.Catch' verwenden. – morbusg

+0

@ivo, ein Beispiel geben zusammen.Ich habe es nicht geschafft und habe es funktioniert.Vielleicht schraube ich irgendwo – yBrodsky

2

Stellen Sie sicher, dass jeder Anruf an eine then() einen Wert zurückgibt.

Für z.B.

var url = 'https://www.google.co.in'; 
 
var options = {}; 
 
var resolves = Promise.resolve(); 
 

 
resolves.then(() => { 
 
    console.log('Resolved first promise'); 
 
    var fetchPromise = fetch(url, options); 
 
    fetchPromise.then(() => { 
 
    console.log('Completed fetch'); 
 
    }); 
 
}) 
 
.catch(error => { 
 
    console.log('Error', error); 
 
});

Hinweis der console zeigt eine abgefangene Ausnahme. Wenn du jedoch das innere Versprechen (oder irgendeinen anderen Wert, der sich über resolve in ein Versprechen verwandelt) zurückbringst, brichst du das Versprechen so ab, dass die Ausnahme platzt.

var url = 'https://www.google.co.in'; 
 
var options = {}; 
 
var resolves = Promise.resolve(); 
 

 
resolves.then(() => { 
 
    console.log('Resolved first promise'); 
 
    var fetchPromise = fetch(url, options); 
 
    return fetchPromise.then(() => { 
 
    console.log('Completed fetch'); 
 
    }); 
 
}) 
 
.catch(error => { 
 
    console.log('Error', error); 
 
});

Hinweis sprudelt die Ausnahme von der äußeren verspricht. Hoffe, das klärt die Dinge ein wenig auf.

+0

Bitte beachten Sie die "Bitte beachten Sie" am Ende der Frage.Danke :) – morbusg

+0

Ja, aber das ist der Fall Wenn Sie Ausdrücke verwenden, die geschweifte Klammern in Ihren Pfeilfunktionen nicht benötigen. Ich war mir nicht 100% sicher, dass das überall in deinem Code der Fall war. :) – Rahul