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

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

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

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

非同期処理

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

Q&A

解決済

2回答

2150閲覧

node.jsでの非同期処理について

SasakiAkira

総合スコア37

Node.js

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

非同期処理

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

0グッド

0クリップ

投稿2016/04/13 15:37

編集2016/04/13 15:47

以下のコードをnode.jsで実行します。

javascript:

1var array = [1,9,2,0,5,4,8,6,3,7]; 2array.sort((a,b) => { 3 return a - b; 4}); 5array.forEach(i => { 6 console.log(i); 7}); 8//理想のアウトプット 9//0 10//1 11//2 12//3 13//4 14//5 15//6 16//7 17//8 18//9 19

node.jsは非同期処理を行うので、array.sortarray.forEachはどちらが先に実行されるかの保証はないと思うのですが、上のような場合に必ずsortを先に行う方法はありますでしょうか。asyncserieswaterfallを使った方法も考えたのですが,callbackをsortメソッドが確実に終了した後に実行する手段が見つからないので考えあぐねています。
js、node.jsともに初心者なので大きな勘違いやごく基本的な部分が抜けていることもあるかもしれませんが、その場合は調べ方など簡単に教えてくださると幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

node.jsは非同期処理を行うので、array.sortとarray.forEachはどちらが先に実行されるかの保証はないと思うのですが、

それは無いと思います。fs.readFile などの関数については非同期で動作しますが、fs.readFileSync は同期的に動作します。

【Node.js v5.10.1 Manual & Documentation】
https://nodejs.org/dist/latest-v5.x/docs/api/

【[Node.js] 非同期型イベント駆動とは 〜 JSおくのほそ道 #001 - Qiita】
http://qiita.com/hosomichi/items/16597eaabb1226975c51

また、非同期処理も Promise を使って順序を作ることもできます。

【非同期処理ってどういうこと?JavaScriptで一から学ぶ - Qiita】
http://qiita.com/kiyodori/items/da434d169755cbb20447

(回答しているうちに解決してたw)

投稿2016/04/13 17:27

kei344

総合スコア69398

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

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

SasakiAkira

2016/04/13 17:32

回答ありがとうございます。関数によって同期的に作動するもの、非同期的に作動するもののがあるという解釈でいいでしょうか。 公式のドキュメントもしっかり読んでみようと思います。
kei344

2016/04/13 17:41

・node.js の関数群(fs.readFile など)は基本非同期なのだけれど、同期関数も用意している ・JavaScriptの標準ビルトインオブジェクト(Arrayなど)のメソッドは同期的に動くはず と言うことです。
mpyw

2016/04/13 20:27

・「準備ができた」または「終わった」ときに動作するコールバック引数がある ・Promiseを返す このどちらかに該当する関数は非同期関数です.それ以外はほとんどすべて同期関数であるといってよいでしょう.
mpyw

2016/04/13 20:29

ECMAScript 8 からはasync/awaitが導入される予定で,すべての非同期関数は「async」と宣言することが基本になると思うので,見分けがつきやすくなるはずなんですが… http://qiita.com/gaogao_9/items/5417d01b4641357900c7
SasakiAkira

2016/04/14 10:33

kei334様、CertaiN様、コメントありがとうございます。 追加の質問まで答えていただいてとても感謝しています。 ご丁寧にありがとうございました。。
guest

0

ベストアンサー

これは失礼しました!ツッコミが入りまくっているようですので、コード訂正しておきました。
非同期処理についてイメージをつかむ参考になれば幸いです。

javascript

1// 0〜100の数値がランダムに100入った配列を生成 2var arr = []; 3for (var i=0; i<100; i++) { 4 arr[i] = Math.round(Math.random()*100); 5} 6 7// 10秒以内のどこかで実行される非同期処理化したソート 8var asyncSortFunc = (array) => { 9 setTimeout(() => { 10 array.sort((a,b) => { 11 return a - b; 12 }); 13 }, Math.round(Math.random()*10000)); 14} 15 16// ソートは10秒以内のどこかで実行される非同期処理になっているが、 17// この関数はpromiseオブジェクトを返す。そのため、resolveすることで、 18// setTimeout(非同期処理)終了後に次の処理.then以降を開始できる。 19var promiseAsyncSortFunc = (array) => { 20 return new Promise((resolve) => { 21 setTimeout(() => { 22 array.sort((a,b) => { 23 return a - b; 24 }); 25 resolve(array); 26 }, Math.round(Math.random()*10000)); 27 }); 28} 29 30// ログを出力する関数 31var logFunc = (array) => { 32 array.forEach(i => { 33 console.log(i); 34 }); 35} 36 37//////////////////// 38// 10秒以内のどこかで実行される非同期処理のソートを使った非同期処理のイメージ 39//////////////////// 40asyncSortFunc(arr);//10秒以内にソートする非同期処理 41logFunc(arr); //上のソートは非同期処理のためここではランダムな配列のまま表示 42setTimeout(() => { logFunc(arr); }, 11000); //11秒後にはソートされた配列を表示 43 44//////////////////// 45// 10秒以内のどこかで実行される非同期処理のソートをPromiseで同期的に実行する 46////////// 47promiseAsyncSortFunc(arr) 48.then((sortedArr) => { //promiseAsyncSortFuncのresolveが呼ばれたら実行 49 logFunc(sortedArr); 50}); 51 52//////////////////// 53// javascriptのビルドイン関数は同期処理です。はい。 54// 私の最初の回答の書き方をする必要はありません。 55//////////////////// 56arr.sort((a,b) => { 57 return a - b; 58}); 59logFunc(arr); //ちゃんとソート後にログ出力される 60

投稿2016/04/13 16:58

編集2016/04/14 10:31
bleurouge

総合スコア161

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

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

SasakiAkira

2016/04/13 17:24

なるほど、node以前の問題ですね。 まだまだ習熟が足りないと実感しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問