2016-09-09 17 views
0

特定のクエリを実行して応答を解析するために使用されるmain関数があります。その関数の最初のステップは、その関数に与えられたパラメータを検証することです。それから私は、クエリを生成し、署名し、それを送信します。最後に、私は応答を処理します。NodeJSは、連鎖同期と非同期関数を結合します

クエリを送信するために、私は約束パターンを使用したいと思います。私が望むのは、主な機能が約束を返すということです。問題は、ほとんどの機能が同期であり、非同期ではないため、私は約束を使用すべきではないということです。最初の関数は約束を返さないことを、

return this.validateQueryAttributes(attributes) 
    .then(generateQuery) 
    .then(signQuery) 
    .then(sendQuery) 
    .then(handleResponse); 

問題がある:私は何をしたいと思うことは、このようなものです。だから私はそれを他の関数と連鎖させることはできません。そのパターンは約束を得ることを期待しています。また、私は呼び出している関数のいずれかで発生する可能性のあるエラー状態を捕捉するために使いたいレベルの.catch関数を持っています。最初の関数を他の関数と連鎖させないと、最初の関数で起こったエラーはキャッチされませんでしたか?

+2

はい、しかし、関数自体が同期していると約束を返すべきではありません。非同期関数には約束だけを使うべきです。 –

+0

これはこの状況でのベストプラクティスですか?はいと思ったら、答えとして投稿してください。そして、その非同期ラッパーを作る方法:) –

答えて

1

あなたは約束のチェーンを開始してからthenハンドラとして同期(そしておそらく投げ)関数を使用するPromise.resolve()を使用することができます:あなたは、このようなブルー​​バードなどのライブラリを使用している場合は、代わりに

return Promise.resolve(attributes) 
    .then(this.validateQueryAttributes) // you might need .bind(this) 
    .then(generateQuery) 
    .then(signQuery) 
    .then(sendQuery) 
    .then(handleResponse); 

、あなたも使用することができますPromise.tryまたはPromise.methodを使用して、同期例外をキャッチします。

関連する問題