回答編集履歴

2

コード訂正

2016/04/14 10:31

投稿

bleurouge
bleurouge

スコア161

test CHANGED
@@ -126,14 +126,4 @@
126
126
 
127
127
 
128
128
 
129
- ////////////////////
130
-
131
- // さらに、非同期関数を最初の回答の書き方をしたところで逐次実行はしません。
132
-
133
- // 非同期処理のソート終了前にarray.forEachを実行するためエラー!
134
-
135
- ////////////////////
136
-
137
- //logFunc(asyncSortFunc(arr)); // arrがundefind!!!
138
-
139
129
  ```

1

コード訂正

2016/04/14 10:30

投稿

bleurouge
bleurouge

スコア161

test CHANGED
@@ -1,16 +1,16 @@
1
- node.jsというよりかJavascriptについの質問ですね
1
+ これは失礼しました!ツッコミが入りまくってるよですのでコード訂正しおきました
2
2
 
3
- 方法は他にもあるとおもいます。分かりやすそうな感じだと以下はいかがでしょうか。
4
-
5
- また、タグ javascriptを付けおくと早い回答得らると思す。
3
+ 非同期処理ついイメージつかむ参考になば幸す。
6
4
 
7
5
 
8
6
 
9
7
  ```javascript
10
8
 
9
+ // 0〜100の数値がランダムに100入った配列を生成
10
+
11
11
  var arr = [];
12
12
 
13
- for (var i=0; i<1000; i++) {
13
+ for (var i=0; i<100; i++) {
14
14
 
15
15
  arr[i] = Math.round(Math.random()*100);
16
16
 
@@ -18,15 +18,53 @@
18
18
 
19
19
 
20
20
 
21
- var sortFunc = (array) => {
21
+ // 10秒以内のどこかで実行される非同期処理化したソート
22
22
 
23
- return array.sort((a,b) => {
23
+ var asyncSortFunc = (array) => {
24
24
 
25
+ setTimeout(() => {
26
+
27
+ array.sort((a,b) => {
28
+
25
- return a - b;
29
+ return a - b;
30
+
31
+ });
32
+
33
+ }, Math.round(Math.random()*10000));
34
+
35
+ }
36
+
37
+
38
+
39
+ // ソートは10秒以内のどこかで実行される非同期処理になっているが、
40
+
41
+ // この関数はpromiseオブジェクトを返す。そのため、resolveすることで、
42
+
43
+ // setTimeout(非同期処理)終了後に次の処理.then以降を開始できる。
44
+
45
+ var promiseAsyncSortFunc = (array) => {
46
+
47
+ return new Promise((resolve) => {
48
+
49
+ setTimeout(() => {
50
+
51
+ array.sort((a,b) => {
52
+
53
+ return a - b;
54
+
55
+ });
56
+
57
+ resolve(array);
58
+
59
+ }, Math.round(Math.random()*10000));
26
60
 
27
61
  });
28
62
 
29
63
  }
64
+
65
+
66
+
67
+ // ログを出力する関数
30
68
 
31
69
  var logFunc = (array) => {
32
70
 
@@ -40,6 +78,62 @@
40
78
 
41
79
 
42
80
 
81
+ ////////////////////
82
+
83
+ // 10秒以内のどこかで実行される非同期処理のソートを使った非同期処理のイメージ
84
+
85
+ ////////////////////
86
+
87
+ asyncSortFunc(arr);//10秒以内にソートする非同期処理
88
+
89
+ logFunc(arr); //上のソートは非同期処理のためここではランダムな配列のまま表示
90
+
91
+ setTimeout(() => { logFunc(arr); }, 11000); //11秒後にはソートされた配列を表示
92
+
93
+
94
+
95
+ ////////////////////
96
+
97
+ // 10秒以内のどこかで実行される非同期処理のソートをPromiseで同期的に実行する
98
+
99
+ //////////
100
+
101
+ promiseAsyncSortFunc(arr)
102
+
103
+ .then((sortedArr) => { //promiseAsyncSortFuncのresolveが呼ばれたら実行
104
+
43
- logFunc(sortFunc(arr));
105
+ logFunc(sortedArr);
106
+
107
+ });
108
+
109
+
110
+
111
+ ////////////////////
112
+
113
+ // javascriptのビルドイン関数は同期処理です。はい。
114
+
115
+ // 私の最初の回答の書き方をする必要はありません。
116
+
117
+ ////////////////////
118
+
119
+ arr.sort((a,b) => {
120
+
121
+ return a - b;
122
+
123
+ });
124
+
125
+ logFunc(arr); //ちゃんとソート後にログ出力される
126
+
127
+
128
+
129
+ ////////////////////
130
+
131
+ // さらに、非同期関数を最初の回答の書き方をしたところで逐次実行はしません。
132
+
133
+ // 非同期処理のソート終了前にarray.forEachを実行するためエラー!
134
+
135
+ ////////////////////
136
+
137
+ //logFunc(asyncSortFunc(arr)); // arrがundefind!!!
44
138
 
45
139
  ```