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

回答編集履歴

2

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

2016/11/06 02:00

投稿

mit0223
mit0223

スコア3401

answer CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
  ###コールバックによる非同期動作について
31
- 他の質問へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
31
+ 他の回答へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
32
32
 
33
33
  もとのコードの```dynamodb.scan``` を呼び出した時、この API はその終了を待たずに帰ってきます。
34
34
  すると、getAllQueryの実行自身も終了し、 ```function (err, data) {}```で記述した内容は実行を保留された状態になります。この保留された内容はプログラム全体が終了まで実行されません。したがいまして、
@@ -40,4 +40,9 @@
40
40
 
41
41
  と書きたくても、 result に結果を入れることは不可能なのです。一旦、プログラムを終了すれば、保留されていたコールバック(```function (err, data) {}```で記述した内容)が実行されます。そして、そこから新たな旅を始めなければなりません。
42
42
 
43
+ node.js はシングルスレッドで動作しており、
44
+ 0. 読み込んだプログラムの実行
45
+ 0. 保留されたコールバックのうち、実行可能なもの(I/Oが終わったもの)を一つ選び実行
46
+ 0. 2.を繰り返し、保留されたコールバックがなくなるとプロセスを終了
47
+
43
- node.js はシングルスレッドで動作しており I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマルチスレッドプログラミングのように微妙なタイミングを考えてmutex を使ったりする必要が無いわけです。
48
+ という処理を行います。シングルスレッドであるため、I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマルチスレッドプログラミングのように微妙なタイミングを考えてmutex を使ったりする必要が無いわけです。

1

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

2016/11/06 02:00

投稿

mit0223
mit0223

スコア3401

answer CHANGED
@@ -24,4 +24,20 @@
24
24
 
25
25
  と書くようにする必要があります。これがコールバック地獄と呼ばれており、この function のネストが深くなりすぎないようにする技がいろいろとありますので、「Javascript コールバック地獄」などで検索してみてください。
26
26
 
27
- 参考:[Node.jsのコールバック地獄をPromiseやGeneratorを使って解消する](http://postd.cc/node-js-callback-hell-promises-generators/)
27
+ 参考:[Node.jsのコールバック地獄をPromiseやGeneratorを使って解消する](http://postd.cc/node-js-callback-hell-promises-generators/)
28
+
29
+
30
+ ###コールバックによる非同期動作について
31
+ 他の質問へのコメントを見ていて、コールバックによる非同期動作について解説する必要があるかと思い、追記します。
32
+
33
+ もとのコードの```dynamodb.scan``` を呼び出した時、この API はその終了を待たずに帰ってきます。
34
+ すると、getAllQueryの実行自身も終了し、 ```function (err, data) {}```で記述した内容は実行を保留された状態になります。この保留された内容はプログラム全体が終了まで実行されません。したがいまして、
35
+
36
+ ```javascript
37
+ var result = getAllQuery(TABLE_ACCOUNT_LIST);
38
+ // result を参照する処理
39
+ ```
40
+
41
+ と書きたくても、 result に結果を入れることは不可能なのです。一旦、プログラムを終了すれば、保留されていたコールバック(```function (err, data) {}```で記述した内容)が実行されます。そして、そこから新たな旅を始めなければなりません。
42
+
43
+ node.js はシングルスレッドで動作しており、 I/O ごとにスレッドの実行を保留することは性能上許されません。そのかわりにマルチスレッドプログラミングのように微妙なタイミングを考えてmutex を使ったりする必要が無いわけです。