2016-07-27 38 views
0

Wie soll ich Fehler in Bluebird-Coroutinen behandeln?bluebirdjs Coroutine Fehlerbehandlung (Browser)

Ich habe Co in Knoten für eine Weile verwendet, die eine große Fangfunktion hat.

co(function*() { 

    return new Promise(function(resolve, reject) { 
     // whatever stuff 
    }); 

}).catch(function(err) {console.error(error.stack)}); 

Aber mit bluebird auf der Browser/Client-Seite ist es ein totaler Albtraum. Es gibt keine catch-Funktion und die Fehler, die ich zurück bekomme - wenn überhaupt - sind entweder anonym oder unbehandelt, was total ...

Ich habe auf der Website von bluebirdjs überprüft und es gab Diskussionen darüber, wie Fehler vor ein paar Monaten zu behandeln. Sogar jemand schrieb:

Es sollte ein besseres Beispiel geben, das die Vorteile der Verwendung von try, catch und schließlich in der Coroutine hervorhebt.

http://bluebirdjs.com/docs/api/promise.coroutine.html

Ich meine: versuchen, fangen schließlich im Koroutine verschachtelt? Ich gebe zu, dass ich diesen Rat sogar für ein paar Routinen befolgt habe, aber ich scheint einfach nicht richtig zu sein. Der ganze Sinn von Promises und Coroutines ist es, hässliche exzessive Verschachtelung loszuwerden, die die Callbacks geschaffen haben und was nun? Jetzt geht das schon wieder los?

Bitte, wenn jemand eine Idee hat, wie dieses bluebirdjs Fehler Chaos in eine bessere Lösung verwandelt werden kann, würde ich es wirklich schätzen.

+0

'Promise.coroutine' ==' co.wrap'. Beide Rückgabefunktionen, die Versprechen zurückgeben, die "Fang" -Methoden haben. – Bergi

+0

@Bergi Blöd mich, du hast Recht. Ich habe versucht, Fang vor Invokation wie diese * Promise.coroutine (/ * Generator Sachen * /). Catch (Handler) * statt * Promise.coroutine (/ * Generator Sachen * /) eingestellt werden.() .Catch (Handler) * – LongHike

Antwort

0

Wenn das co ist ein Bluebird Promise.coroutine wird es automatisch Fehler propagieren und unbehandelt Ablehnungen protokollieren.

Unbehandelte Fehler werden protokolliert. Sie können Fehler wie behandeln:

Promise.coroutine(function*() { 
    try { 
     doSomething(); 
     yield doSomethingAsync(); 
    } catch (e) { 
     // handle error 
    } 
})(); 
+0

Natürlich ist Ihre Antwort richtig. Aber die Sache ist: Es sollte nicht so sein. I-Fehler sind bereits in doSomethingAsync gefangen, dann sollte es keinen weiteren try/catch-Block in der Coroutine geben. – LongHike

+0

Richtig, und es funktioniert tatsächlich so - hast du etwas anderes erlebt? –