3

Ich versuche, Versprechungen zu lernen, mit Typoskript, und ich habe ein paar Probleme, zu verstehen, was verursacht solche vscode Debugging-Verhalten. Hiertypescript Versprechen Ablehnung und vscode Debugger Verhalten

ist ein Beispiel:

// example 1 
new Promise((resolve, reject) => { 
    reject("test1"); // debugger stops as on uncaught exception 
}) 
.catch(
    error => { 
     console.log(error); 
    } 
); 
// output: "test1" 

, und:

//example 2 
new Promise((resolve, reject) => { 
    setTimeout(() => { 
     reject("test2"); // debugger never stops 
    }); 
}) 
.catch(
    error => { 
     console.log(error); 
    } 
); 
// output: "test2" 

Wie Sie in einem Fall Debugger an Versprechen sehen stoppt ablehnen, aber in anderen Fällen nicht. In allen Fällen wird jedoch ein Fehler festgestellt, und keine unbehandelten Ausnahmen.

Ist es vscode spezifisches Verhalten oder vielleicht es6-Versprechen Bindung, die ich verwende? Oder mache ich es falsch? Hat jemand das gleiche Problem?

+0

Sieht aus wie ein Fehler im Debugger in der Tat. Oder es behandelt nur "ablehnen" -Aufrufe wie "werfen", auf denen es standardmäßig anhalten kann. – Bergi

Antwort

1

Dies ist eine Heuristik, mit der der Chrome-Debugger, in den VSCode eingebunden ist, verwendet wird. Sie gehen davon aus, dass synchrone Ablehnungen typischerweise Programmierer Fehler sind, die Sie (wie ein Tippfehler) brechen möchten und asynchrone sind nicht, da sie normalerweise IO (Lesen einer Datei) sind.

Es ist eine ziemlich dumme Heuristik, aber es ist in der Regel in einigen Fällen sinnvoll. Eine Sache, die Sie tun können, ist enthalten drossel für den Debug-Build (es ist zu 100% kompatibel, wenn Sie nicht Promise Unterklasse) und dann einen nicht behandelte Ablehnung Haken hinzu:

Promise.onPossiblyUnhandledRejection(function(e, promise) { 
    throw e; 
}); 

, die eine viel schönere Heuristik verwendet. Sie können dies auch mit nativen Versprechungen (mit Ablehnungsereignissen) tun, aber ich weiß nicht, wie Sie die automatische Unterbrechung bei synchronen Würfen ausschalten können.

+1

Ich habe festgestellt, dass 'const Promise = require ('bluebird');' das Problem für mich behebt. Bluebird ist nur flexibler als native Promises, denke ich und es ist mir egal, wenn Sie synchrone Ablehnungen verwenden. –

Verwandte Themen