2016-06-22 5 views
4

私のnode.jsアプリケーションにasync.jsを使用しています。私は次の問題を解決するための助けが必要です。Async.jsデザインパターン

私は次のaysnc jsシリーズの機能を持っています。

async.waterfall([ 
    function getDataFromDB(request, response, callback){ ... }, 
    function someOperationOnDBData(dbData, response, callback){ ... }, 
    function renderSomeFlow(evaluatedData, response, callback){ ... } 
]); 

私は、上記の順番で3つの機能を呼び出しています。私はgetDataFromDBからデータを受け取り、someOperationOnDBDataなどに渡しています。

getDataFromDBsomeOperationOnDBDataの間にもう1つの操作が必要だとしますが、DBDataを引き続き転送します。例:ここでは

async.waterfall([ 
    function getDataFromDB(request, response, callback){ ... }, 
    function extraOperation(dbData, response, callback) {...} 
    function someOperationOnDBData(dbData, extraOperationData, response, callback){ ... }, 
    function renderSomeFlow(evaluatedData, response, callback){ ... } 
]); 

が途中でシングルステップを追加するには、関数定義を変更しても、私はちょうどsomeOperationOnDBDataに転送するextraOperationdbDataを渡す必要があります。 また、途中で別のモジュールを呼び出す場合、一部のデータを転送するパラメータを変更できないことがあります。

中間関数でデータを転送せずにasync.jsの関数間でデータを渡すこの問題を解決するにはどうすればよいですか?新しいステップが含まれるたびに機能をリファクタリングすることは不可能です。このタイプの問題を解決するための設計パターンは何ですか?

+0

はちょっとした話題ですが、私はあなたが約束する必要があると思います。 – Hitmands

+0

@Hitmandsもっと詳しく教えていただけますか?約束はどのようにこの問題を解決するでしょうか? – dejavu

+0

@dejavuプロミスには、本来のプロミスに滝をつけることができないので、あなたのメソッドのリファクタリングが必要です。しかし、あなたが行うことができるのは、あなたが操作して追加するチェーンを通して単一のオブジェクトを送信することです。次に、そのチェーン内のすべてのメソッドで関数シグネチャを変更しません。矛盾するプロパティ名がない限りさらに、コールバックよりもはるかに複雑なフローを作成し、チェーンを平坦化します。コールバック地獄はもうありません。私は毎回のコールバック以上の約束を選ぶだろう。 – ste2425

答えて

4

waterfallを使用すると、データを渡す必要があります - 途中で滝を止めることはできません:)。たとえば、autoのように、他の関数の結果に依存する関数を指定することができます。asyncは、それらを実行するための最良の順序を決定します。

autoという構文が少し厄介ですが、必要なのはそれだけです。次に例を示します。

async.auto({ 
    db: function getDataFromDB(callback){ ... }, 
    extra: ['db', function extraOperation(results, callback) {...}], 
    some: ['db', function someOperationOnDBData(results, callback){ ... }], 
    render: ['some', 'db', function renderSomeFlow(results, callback){ ... }] 
}); 
0

私は矢印の機能を使用して関数をカリー化すると、この問題arroundの方法であることを発見しました:Medium.comでJavaScript機能をカレー方法について

const someOperationOnDBData = extraOperationData => (dbData, response, callback) => { 
    // do your function work 
}; 

async.waterfall([ 
    function getDataFromDB(request, response, callback){ ... }, 
    function extraOperation(dbData, response, callback) {...} 
    someOperationOnDBData(extraOperationData)(dbData, response, callback), 
    function renderSomeFlow(evaluatedData, response, callback){ ... } 
]); 

多くの良い例