質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

4回答

12887閲覧

node.jsにおいて部分的に非同期処理を同期処理にする方法

777

総合スコア34

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

同期

複数のディレクトリに存在するファイルを更新した場合に、すべてのファイルにも更新が行われる事、又は、同じ記憶領域に同時にアクセスして内容の整合性が失われてしまう事をを防ぐ制御などを同期と呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

4クリップ

投稿2015/09/02 03:30

以下に記述する順番で処理を実行させたい場合についての質問です
(処理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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
horse_n_deer

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

さっきのは

  • B-1~B-3が長いので全部asyncでくるむのは見通しが悪くなるので避けたい
  • B-1~B-3の非同期処理を同期的に処理させる方法が知りたい

という質問の趣旨に合ってなかったようで、すみません

非同期の関数を何とか同期にするということであれば

synchronize.js

とかはどうでしょうか

投稿2015/09/04 03:12

khirose

総合スコア251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

777

2015/09/04 16:04

khiroseさん ご回答ありがとうございます。 async使い慣れていなかったので、 お手本にさせて頂きます。 synchronize.jsを知らなかったので 調べてみます。 結構複雑な処理をしていて、関数を多用しているので その関数群も含めてasyncで包むというのが大変だなと思っています。 サーバの初期化で、 前回までの結果を読み込んで集計してからサーバ起動。 サービス中にもredisのデータを使って ユーザに結果を返す。 もう少し設計を見直して、非同期でも動けるようにするのも 手かなとも思い始めました。
guest

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

khirose

総合スコア251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

await構文を使ってみてはどうでしょうか。
非同期処理をあたかも同期処理のように扱えます。

投稿2016/08/26 11:27

syuilo

総合スコア393

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問