回答編集履歴

2

もう少し、核心部分を追記

2016/11/06 02:00

投稿

mit0223
mit0223

スコア3401

test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  ###コールバックによる非同期動作について
60
60
 
61
- 他の質問へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
61
+ 他の回答へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
62
62
 
63
63
 
64
64
 
@@ -82,6 +82,16 @@
82
82
 
83
83
 
84
84
 
85
+ node.js はシングルスレッドで動作しており、
86
+
87
+ 0. 読み込んだプログラムの実行
88
+
85
- node.js はシングルスレッドで動作しており、 I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマチスレドプログラミングに微妙タイミングを考えてmutex を使ったりする必要が無いわけです。
89
+ 0. 保留されたコーのうち、実行可能もの(I/Oが終わったもの)を一つ選び実行
90
+
91
+ 0. 2.を繰り返し、保留されたコールバックがなくなるとプロセスを終了
86
92
 
87
93
 
94
+
95
+ という処理を行います。シングルスレッドであるため、I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマルチスレッドプログラミングのように微妙なタイミングを考えてmutex を使ったりする必要が無いわけです。
96
+
97
+

1

コールバックに関する説明を追加

2016/11/06 02:00

投稿

mit0223
mit0223

スコア3401

test CHANGED
@@ -51,3 +51,37 @@
51
51
 
52
52
 
53
53
  参考:[Node.jsのコールバック地獄をPromiseやGeneratorを使って解消する](http://postd.cc/node-js-callback-hell-promises-generators/)
54
+
55
+
56
+
57
+
58
+
59
+ ###コールバックによる非同期動作について
60
+
61
+ 他の質問へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
62
+
63
+
64
+
65
+ もとのコードの```dynamodb.scan``` を呼び出した時、この API はその終了を待たずに帰ってきます。
66
+
67
+ すると、getAllQueryの実行自身も終了し、 ```function (err, data) {}```で記述した内容は実行を保留された状態になります。この保留された内容はプログラム全体が終了まで実行されません。したがいまして、
68
+
69
+
70
+
71
+ ```javascript
72
+
73
+ var result = getAllQuery(TABLE_ACCOUNT_LIST);
74
+
75
+ // result を参照する処理
76
+
77
+ ```
78
+
79
+
80
+
81
+ と書きたくても、 result に結果を入れることは不可能なのです。一旦、プログラムを終了すれば、保留されていたコールバック(```function (err, data) {}```で記述した内容)が実行されます。そして、そこから新たな旅を始めなければなりません。
82
+
83
+
84
+
85
+ node.js はシングルスレッドで動作しており、 I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマルチスレッドプログラミングのように微妙なタイミングを考えてmutex を使ったりする必要が無いわけです。
86
+
87
+