teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コード訂正

2016/04/14 10:31

投稿

bleurouge
bleurouge

スコア161

answer CHANGED
@@ -62,9 +62,4 @@
62
62
  });
63
63
  logFunc(arr); //ちゃんとソート後にログ出力される
64
64
 
65
- ////////////////////
66
- // さらに、非同期関数を最初の回答の書き方をしたところで逐次実行はしません。
67
- // 非同期処理のソート終了前にarray.forEachを実行するためエラー!
68
- ////////////////////
69
- //logFunc(asyncSortFunc(arr)); // arrがundefind!!!
70
65
  ```

1

コード訂正

2016/04/14 10:30

投稿

bleurouge
bleurouge

スコア161

answer CHANGED
@@ -1,23 +1,70 @@
1
+ これは失礼しました!ツッコミが入りまくっているようですので、コード訂正しておきました。
1
- node.jsというよりか、Javascriptについての質問です
2
+ 非同期処理についてイメージをつかむ参考になれば幸いです。
2
- 方法は他にもあるとおもいます。分かりやすそうな感じだと以下はいかがでしょうか。
3
- また、タグに javascriptを付けておくと早い回答を得られると思います。
4
3
 
5
4
  ```javascript
5
+ // 0〜100の数値がランダムに100入った配列を生成
6
6
  var arr = [];
7
- for (var i=0; i<1000; i++) {
7
+ for (var i=0; i<100; i++) {
8
8
  arr[i] = Math.round(Math.random()*100);
9
9
  }
10
10
 
11
+ // 10秒以内のどこかで実行される非同期処理化したソート
11
- var sortFunc = (array) => {
12
+ var asyncSortFunc = (array) => {
13
+ setTimeout(() => {
12
- return array.sort((a,b) => {
14
+ array.sort((a,b) => {
13
- return a - b;
15
+ return a - b;
16
+ });
17
+ }, Math.round(Math.random()*10000));
18
+ }
19
+
20
+ // ソートは10秒以内のどこかで実行される非同期処理になっているが、
21
+ // この関数はpromiseオブジェクトを返す。そのため、resolveすることで、
22
+ // setTimeout(非同期処理)終了後に次の処理.then以降を開始できる。
23
+ var promiseAsyncSortFunc = (array) => {
24
+ return new Promise((resolve) => {
25
+ setTimeout(() => {
26
+ array.sort((a,b) => {
27
+ return a - b;
28
+ });
29
+ resolve(array);
30
+ }, Math.round(Math.random()*10000));
14
31
  });
15
32
  }
33
+
34
+ // ログを出力する関数
16
35
  var logFunc = (array) => {
17
36
  array.forEach(i => {
18
37
  console.log(i);
19
38
  });
20
39
  }
21
40
 
41
+ ////////////////////
42
+ // 10秒以内のどこかで実行される非同期処理のソートを使った非同期処理のイメージ
43
+ ////////////////////
44
+ asyncSortFunc(arr);//10秒以内にソートする非同期処理
45
+ logFunc(arr); //上のソートは非同期処理のためここではランダムな配列のまま表示
46
+ setTimeout(() => { logFunc(arr); }, 11000); //11秒後にはソートされた配列を表示
47
+
48
+ ////////////////////
49
+ // 10秒以内のどこかで実行される非同期処理のソートをPromiseで同期的に実行する
50
+ //////////
51
+ promiseAsyncSortFunc(arr)
52
+ .then((sortedArr) => { //promiseAsyncSortFuncのresolveが呼ばれたら実行
22
- logFunc(sortFunc(arr));
53
+ logFunc(sortedArr);
54
+ });
55
+
56
+ ////////////////////
57
+ // javascriptのビルドイン関数は同期処理です。はい。
58
+ // 私の最初の回答の書き方をする必要はありません。
59
+ ////////////////////
60
+ arr.sort((a,b) => {
61
+ return a - b;
62
+ });
63
+ logFunc(arr); //ちゃんとソート後にログ出力される
64
+
65
+ ////////////////////
66
+ // さらに、非同期関数を最初の回答の書き方をしたところで逐次実行はしません。
67
+ // 非同期処理のソート終了前にarray.forEachを実行するためエラー!
68
+ ////////////////////
69
+ //logFunc(asyncSortFunc(arr)); // arrがundefind!!!
23
70
  ```