以下に記述する順番で処理を実行させたい場合についての質問です
(処理Bは非同期です)
処理A
処理B-1
処理B-2
処理B-3
処理C
調べたところ、
async.seriesで処理Bを囲めば
処理A
処理B群
処理C
となるかなと思ったのですが、
async.seriesのブロックそれ自体が非同期になるので
処理A
処理C
処理B群となってしまいました
処理AもCも含めてasync.seriesで囲めば何とかなりそうですが、
非常に長くて複雑なので、見通しが悪くなってしまうのでそうしたくはありません。
このような場合に、
非同期の処理部分を同期にする方法はありませんでしょうか?
readFileならreadFileSyncを使えばいいですが、
Syncバージョンが用意されていない場合どうしたらいいですか?
というのと似た質問かもしれません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
node.jsのバージョンがv0.12以上であれば、Promiseを利用して簡潔に記述できます。
bash
1node -v 2# v0.12.7 3 4node task.js 5# taskA 6# taskA done 7# taskB1 8# taskB2 9# taskB3 10# taskB1 done 11# taskB2 done 12# taskB3 done 13# taskC 14# taskC done 15# all done
js
1// task.js 2var taskA= new Promise(function(resolve,reject){ 3 console.log('taskA') 4 setTimeout(function(){ 5 console.log('taskA done') 6 resolve() 7 },100) 8}) 9 10taskA 11.then(function(){ 12 var tasks= [] 13 14 var taskB1= new Promise(function(resolve,reject){ 15 console.log('taskB1') 16 setTimeout(function(){ 17 console.log('taskB1 done') 18 resolve() 19 },100) 20 }) 21 tasks.push(taskB1) 22 23 var taskB2= new Promise(function(resolve,reject){ 24 console.log('taskB2') 25 setTimeout(function(){ 26 console.log('taskB2 done') 27 resolve() 28 },100) 29 }) 30 tasks.push(taskB2); 31 32 var taskB3= new Promise(function(resolve,reject){ 33 console.log('taskB3') 34 setTimeout(function(){ 35 console.log('taskB3 done') 36 resolve() 37 },100) 38 }) 39 tasks.push(taskB3); 40 41 return Promise.all(tasks) 42}) 43.then(function(){ 44 var taskC= new Promise(function(resolve){ 45 console.log('taskC') 46 setTimeout(function(){ 47 console.log('taskC done') 48 resolve() 49 },100) 50 }) 51 52 return taskC 53}) 54.then(function(){ 55 console.log('all done') 56}) 57.catch(function(reason){ 58 console.log('fail',reason) 59})
投稿2015/10/30 09:56
編集2015/10/30 10:36総合スコア454
0
さっきのは
- B-1~B-3が長いので全部asyncでくるむのは見通しが悪くなるので避けたい
- B-1~B-3の非同期処理を同期的に処理させる方法が知りたい
という質問の趣旨に合ってなかったようで、すみません
非同期の関数を何とか同期にするということであれば
とかはどうでしょうか
投稿2015/09/04 03:12
総合スコア251
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
async.jsを使うのであれば、async.waterfallとasync.parallelを組み合わせて
javascript
1async.waterfall([ 2 function A(done){ 3 console.log('A'); 4 done(null); 5 }, 6 function B(done){ 7 async.parallel([ 8 function B1(callback){ 9 console.log('B1'); 10 callback(null); 11 }, 12 function B2(callback){ 13 console.log('B2'); 14 callback(null); 15 }, 16 function B3(callback){ 17 console.log('B3'); 18 callback(null); 19 }, 20 ], function(err){ 21 console.log('B1-B3'); 22 done(null); 23 }); 24 }, 25 function C(done){ 26 console.log('C'); 27 done(null); 28 } 29], function(err){ 30 console.log('ALL Complete.'); 31});
みたいな形でどうでしょうか
投稿2015/09/04 02:49
総合スコア251
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。