それはちょうど使用することがより困難になり、同期操作がすでにうまく約束チェーン内で使用することができるよう、あなたが約束して同期動作をラップする理由は不明です。
何か同期的なことを約束するのに便利だと思った唯一の場所は、後続の操作が非同期になる、またはブランチするときにブランチの1つの結果が非同期の約束その他は同期です。その場合、両方のケースで約束を返すだけで、呼び出し元にはどのブランチが使用されても一貫した非同期インターフェイスが得られます。
それ以外は、一般的に非同期の同期を行わないようにする必要があります。なぜなら、これらの同期操作を不必要に複雑にするためです。
約束にそれを作るために私の知っている最も簡単な方法は、このようになります:あなたのコメントパー
Promise.resolve(path.join(path1, path2)).then(function(path) {
// use the result here
});
、.then()
ハンドラ内で、例外がすでに約束インフラストラクチャによって捕捉され、拒否された約束になって。したがって、あなたがこれを持っていた場合:
someAsyncOp().then(function(value) {
// some other stuff
// something that causes an exception
throw new Error("timeout");
}).catch(function(err){
console.log(err); // will show timeout
});
その後、その例外はすでにあなたの約束拒否にマップされています。もちろん、.then()
ハンドラ内で例外を処理したい場合(約束を却下にしないでください)、同期操作の伝統的なtry/catchを使用してローカル例外を捕捉することができます同期コード)。しかし、もしあなたが.then()
ハンドラの中に例外があれば、それが拒否されることを望むなら、それは自動的にあなたのためにすべて行われます(約束の素晴らしい特徴です)。
なぜ、同期関数を約束したいのですか? –
ユニットテストは、非同期呼び出しをハードコードされた値で置き換える必要がある場合によく使用されます。 –
同期関数を約束するための最善の方法は、実行しないことです。 – Bergi