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

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

ただいまの
回答率

90.48%

  • Node.js

    1946questions

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

  • 非同期処理

    115questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 753

SasakiAkira

score 29

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

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/14 02:32

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

    キャンセル

  • 2016/04/14 02:41

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

    キャンセル

  • 2016/04/14 05:27

    ・「準備ができた」または「終わった」ときに動作するコールバック引数がある
    ・Promiseを返す

    このどちらかに該当する関数は非同期関数です.それ以外はほとんどすべて同期関数であるといってよいでしょう.

    キャンセル

  • 2016/04/14 05:29

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

    http://qiita.com/gaogao_9/items/5417d01b4641357900c7

    キャンセル

  • 2016/04/14 19:33

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

    キャンセル

checkベストアンサー

+1

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

// 0〜100の数値がランダムに100入った配列を生成
var arr = [];
for (var i=0; i<100; i++) {
  arr[i] = Math.round(Math.random()*100);
}

// 10秒以内のどこかで実行される非同期処理化したソート
var asyncSortFunc = (array) => {
  setTimeout(() => {
    array.sort((a,b) => {
       return a - b;
    });
  }, Math.round(Math.random()*10000));
}

// ソートは10秒以内のどこかで実行される非同期処理になっているが、
// この関数はpromiseオブジェクトを返す。そのため、resolveすることで、
// setTimeout(非同期処理)終了後に次の処理.then以降を開始できる。
var promiseAsyncSortFunc = (array) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      array.sort((a,b) => {
         return a - b;
      });
      resolve(array);
    }, Math.round(Math.random()*10000));
  });
}

// ログを出力する関数
var logFunc = (array) => {
  array.forEach(i => {
    console.log(i);
  });
}

////////////////////
// 10秒以内のどこかで実行される非同期処理のソートを使った非同期処理のイメージ
////////////////////
asyncSortFunc(arr);//10秒以内にソートする非同期処理
logFunc(arr);      //上のソートは非同期処理のためここではランダムな配列のまま表示
setTimeout(() => { logFunc(arr); }, 11000); //11秒後にはソートされた配列を表示

////////////////////
// 10秒以内のどこかで実行される非同期処理のソートをPromiseで同期的に実行する
//////////
promiseAsyncSortFunc(arr)
.then((sortedArr) => { //promiseAsyncSortFuncのresolveが呼ばれたら実行
  logFunc(sortedArr);
});

////////////////////
// javascriptのビルドイン関数は同期処理です。はい。
// 私の最初の回答の書き方をする必要はありません。
////////////////////
arr.sort((a,b) => {
  return a - b;
});
logFunc(arr); //ちゃんとソート後にログ出力される

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/14 02:24

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Node.js

    1946questions

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

  • 非同期処理

    115questions

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