2016-04-24 9 views
5

私はpath.join()のような同期関数を持っているとしましょう。私はそれをPromiseに包み込みたいのですが、それはcatch()ブロック内で賞賛を受けたいからです。 私が以下のようにラップした場合、私はPromise.catch()ブロックの例外ではありません。だから私はifを使用して戻り値をチェックする必要があります。エラーかどうかを確認してからresolve、reject関数を呼び出す必要があります。他の解決策はありますか?約束事に同期関数をラップする最良の方法

var joinPaths = function(path1,path2) { 
    return new promise(function (resolve, reject) { 
    resolve(path.join(path1, path2)); 
    }); 
}; 
+2

なぜ、同期関数を約束したいのですか? –

+1

ユニットテストは、非同期呼び出しをハードコードされた値で置き換える必要がある場合によく使用されます。 –

+1

同期関数を約束するための最善の方法は、実行しないことです。 – Bergi

答えて

6

それはちょうど使用することがより困難になり、同期操作がすでにうまく約束チェーン内で使用することができるよう、あなたが約束して同期動作をラップする理由は不明です。

何か同期的なことを約束するのに便利だと思った唯一の場所は、後続の操作が非同期になる、またはブランチするときにブランチの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()ハンドラの中に例外があれば、それが拒否されることを望むなら、それは自動的にあなたのためにすべて行われます(約束の素晴らしい特徴です)。

+0

私は約束チェーンで 'path.join'を使用していて、' promise'の '.catch()'ブロックで例外を処理したいのですが、どうすればできますかそれを約束に包んでいるのか? – CoderS

+2

@Srinesh - いつものように、あなたの質問にあなたの実際のコードと実際の問題を入れれば、私たちはあなたを助けることができます。私はあなたがしようとしていることを正確には追いつかない。 promiseチェーンの '.then()'ハンドラはすでにtry/catchでラップされており、 '.then()'ハンドラでスローされた例外は自動的にプロミスチェーンを拒否します。 '.then()'ハンドラの中でその機能を利用するために何もする必要はありません。 try/catchを使用して、同期例外をキャッチしてローカルで処理することもできます。 – jfriend00

+1

約束事の中で同期関数をラップしたい理由の1つは、契約に固執しようとしている場合です。つまり、if(needsUpdating){return object.asyncUpdate();}です。 } else {return object}; '一方のパスがPromiseを返す場合、非同期コードを実行しなくても、もう一方のパスはPromiseを返します。 –

関連する問題