2016-08-23 7 views
0

コード私が持っている:async.autoのような約束を作成するには?ここ

async.auto({ 
    client: service.findClient, 
    existingChat: ['client', service.findChat], 
    chat: ['client', 'existingChat', service.createChat] 
}, (err) => { 
    if (err) return service.handleError(err); 
    service.emitChatEvent(); 
    service.editMenu(); 
}); 

ブルーバードの約束を使用してそれを処理するための最良の方法は何ですか?

私にとって最も混乱の事は、この行です:

chat: ['client', 'existingChat', service.createChat] 

service.createChatは両方service.findClient()service.findChat()結果へのアクセス権を持っている必要があります。

+0

はあなた自身のものを試してみましたか?私はそのコードが何であるかを知ることができないので、別の方法論を使用して書き直す方法を知るのは難しいです - 少なくとも、目的が何であるかについての手掛かりがあります –

+0

@JaromandaX私は質問を更新しました。 – Nazar

+0

あなたの解決策は良く見えます。それが動作する場合は、質問の更新ではなく回答として投稿してください。 – Tomalak

答えて

0

私は解決策を見つけたと思います:

service.findClient(message) 
    .then((client) => [client, service.findChat(client)]) 
    .spread(service.createChat) 
    .then(service.emitChatEvent) 
    .then(service.editMenu) 
    .catch(service.handleError); 
0

async-bluebirdのような他の既に作成されたモジュールを見ることもできます。あなたの質問では、必ずしもあなた自身の例の現実的なバージョンである、あなた自身のauto()約束の実装を必要としないように見えます。その場合、連鎖とall()の機能を組み合わせて使用​​することができます。例えば(テストされていないと私の頭の上から):

let fc = service.findClient(message); 
Promise.all([fc, fc.then(service.findChat)]) 
     .then(service.createChat); 

まず、私はfindClient機能からの約束を作成し、私はall機能のために必要な約束の配列を作成します。最初のものは最初の約束ですが、2番目のものは2番目の関数の最初のものの連鎖バージョンです。両方が完了すると、all関数は両方の約束の結果を結果配列に返します。

関連する問題