3

私は約束を学び、typescriptで、私はいくつかの問題があり、そのようなvscodeのデバッグ動作の原因を理解しています。あなたは、デバッガが、拒否約束で停止1の場合ではなく、他の場合ではありません見ることができるようにtypescript約束を拒否し、vscodeデバッガの動作を

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

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

、および:ここでは

がその例です。しかし、すべての場合にエラーがキャッチされ、処理されない例外はありません。

vscode固有の動作ですか、それとも私が使用しているes6-promiseバインディングですか?それとも私はそれを間違ってやっているの?誰も同じ問題に直面していますか?

+0

実際にデバッガのバグのように見えます。あるいは 'reject'コールを' throw'のように扱うだけで、デフォルトでは停止する可能性があります。 – Bergi

答えて

1

これは、VSCodeが使用するChromeデバッガが使用するヒューリスティックです。同期拒否はで、通常はのプログラマエラー(誤植など)で、非同期拒否は通常IO(ファイルの読み込み)であるためではないと想定しています。

これはかなりダムのヒューリスティックですが、通常は場合によっては意味があります。

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

非常に良く、ヒューリスティックを使用しています:あなたができることの一つは、デバッグビルドの青い鳥は、(あなたがPromiseをサブクラス化していない場合、それは100%互換です)、その後、未処理の拒絶フックを追加しています。ネイティブの約束(拒否イベントあり)でもこれを行うことができますが、同期スローの自動切断をどのようにオフにするかはわかりません。

+1

私は 'const Promise = require( 'bluebird');を使用して問題を解決しました。ブルーバードは、ネイティブプロミスよりも柔軟性があります。同期リジェクションを使用すると思いますが、気にしません。 –

関連する問題