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

回答編集履歴

5

6

2018/04/18 04:35

投稿

think49
think49

スコア18194

answer CHANGED
@@ -24,7 +24,7 @@
24
24
  > 以下のようにすれば期待する結果が得られるでしょうか。
25
25
 
26
26
  なりません。
27
- 「4(10分後) -> 2(25分後) -> 5(30分後)」が出力されます。
27
+ 「4(10分後) -> 2(25分後) -> 6(30分後)」が出力されます。
28
28
  理由は先程説明したように、シングルスレッドだからです。
29
29
 
30
30
  実際に検証して確かめることをお勧めします。

4

期待通りではない

2018/04/18 04:35

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,5 +1,7 @@
1
1
  一応、一つの可能性として。
2
2
 
3
+ ### 同期処理
4
+
3
5
  「n分かかる処理」の内容が不明ですが、同期処理なら「2->1->3」の順に実行されるのが自然です。
4
6
  3が出力されるまでに30分かかっていませんか。
5
7
  「Promiseを通すことで非同期処理化する」と誤解していませんか。
@@ -9,10 +11,23 @@
9
11
  Promiseは**コールバック関数によって**、非同期処理の実行完了を検知する仕組みです。
10
12
  同期処理はコードを書いた順に実行されますので、Promiseを通しても実行順は変化しません。
11
13
 
14
+ ### シングルスレッド
15
+
12
16
  また、おそらく勘違いされていることの一つに「非同期処理 !== 並列処理」があります。
13
17
  JavaScriptはシングルスレッドなので、setTimeoutで非同期処理化してもマルチスレッドにはなりません。
14
18
  「タイマー処理処理1」実行中に「タイマー処理2」の実行開始時刻を迎えた場合、setTimeoutは「タイマー処理1」が終了するまで、「タイマー処理2」を待機させます。
15
19
 
16
20
  マルチスレッド化する為には「Service Worker」を使用します。
17
21
 
22
+ (**2018/04/18 13:34追記**)
23
+
24
+ > 以下のようにすれば期待する結果が得られるでしょうか。
25
+
26
+ なりません。
27
+ 「4(10分後) -> 2(25分後) -> 5(30分後)」が出力されます。
28
+ 理由は先程説明したように、シングルスレッドだからです。
29
+
30
+ 実際に検証して確かめることをお勧めします。
31
+ new Dateをwhileで繰り返せば、n秒待機するsleep関数を作れます。
32
+
18
33
  Re: miga さん

3

コールバック関数

2018/04/18 04:34

投稿

think49
think49

スコア18194

answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  > Promiseで非同期処理化されるという認識ですが、違うのですか?
8
8
 
9
- Promiseはコールバック関数によって、非同期処理の実行制御する仕組みです。
9
+ Promiseは**コールバック関数によって**、非同期処理の実行完了検知する仕組みです。
10
10
  同期処理はコードを書いた順に実行されますので、Promiseを通しても実行順は変化しません。
11
11
 
12
12
  また、おそらく勘違いされていることの一つに「非同期処理 !== 並列処理」があります。

2

非同期処理、マルチスレッド

2018/04/17 23:50

投稿

think49
think49

スコア18194

answer CHANGED
@@ -4,4 +4,15 @@
4
4
  3が出力されるまでに30分かかっていませんか。
5
5
  「Promiseを通すことで非同期処理化する」と誤解していませんか。
6
6
 
7
+ > Promiseで非同期処理化されるという認識ですが、違うのですか?
8
+
9
+ Promiseはコールバック関数によって、非同期処理の実行順を制御する仕組みです。
10
+ 同期処理はコードを書いた順に実行されますので、Promiseを通しても実行順は変化しません。
11
+
12
+ また、おそらく勘違いされていることの一つに「非同期処理 !== 並列処理」があります。
13
+ JavaScriptはシングルスレッドなので、setTimeoutで非同期処理化してもマルチスレッドにはなりません。
14
+ 「タイマー処理処理1」実行中に「タイマー処理2」の実行開始時刻を迎えた場合、setTimeoutは「タイマー処理1」が終了するまで、「タイマー処理2」を待機させます。
15
+
16
+ マルチスレッド化する為には「Service Worker」を使用します。
17
+
7
18
  Re: miga さん

1

typo修正

2018/04/17 23:48

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  一応、一つの可能性として。
2
2
 
3
3
  「n分かかる処理」の内容が不明ですが、同期処理なら「2->1->3」の順に実行されるのが自然です。
4
- 3出力されるまでに30分かかっていませんか。
4
+ 3出力されるまでに30分かかっていませんか。
5
5
  「Promiseを通すことで非同期処理化する」と誤解していませんか。
6
6
 
7
7
  Re: miga さん