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

回答編集履歴

4

連続的に実行

2018/06/17 12:29

投稿

think49
think49

スコア18194

answer CHANGED
@@ -39,6 +39,11 @@
39
39
 
40
40
  ### window.setTimeout() + Queue
41
41
 
42
+ > どんな場面かといいますとチャットメッセージを受信して画面にappendで追加するのですが、その処理を1個ずつ追加するようにしたいのですが、ほぼ同時に関数が呼ばれるといっぺんに追加されてしまうので、それを間を置いて追加されるようにしたいのです。。
43
+
44
+ それは「同時に実行」ではなく、「処理間隔が0もしくは0に近い状態」で**連続的に実行されています**。
45
+ 関数をキュー管理してやれば、解決可能です。
46
+
42
47
  - [WindowOrWorkerGlobalScope.setTimeout() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
43
48
  - [キュー (コンピュータ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A5%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))
44
49
 

3

window.setTimeout() + Queue

2018/06/17 12:29

投稿

think49
think49

スコア18194

answer CHANGED
@@ -37,4 +37,37 @@
37
37
  setTimeout(something, 1000, 2);
38
38
  ```
39
39
 
40
+ ### window.setTimeout() + Queue
41
+
42
+ - [WindowOrWorkerGlobalScope.setTimeout() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
43
+ - [キュー (コンピュータ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A5%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))
44
+
45
+ ```JavaScript
46
+ const setTimeQueue = ((handleTimeout) => {
47
+ const queue = [];
48
+
49
+ return function setTimeQueue (fn, args) {
50
+ queue.push({fn: fn, args: args});
51
+
52
+ if (queue.length === 1) {
53
+ setTimeout(handleTimeout, 500, queue, 500);
54
+ }
55
+ };
56
+ })(function handleTimeout (queue, delayTime) {
57
+ const entry = queue.shift();
58
+
59
+ entry.fn(...entry.args);
60
+
61
+ if (queue.length) {
62
+ setTimeout(handleTimeout, delayTime, queue, delayTime);
63
+ }
64
+ });
65
+
66
+ const consoleLog = console.log.bind(console);
67
+
68
+ setTimeQueue(consoleLog, [1]);
69
+ setTimeQueue(consoleLog, [2]);
70
+ setTimeQueue(consoleLog, [3]);
71
+ ```
72
+
40
73
  Re: koyon さん

2

setTimeout

2018/06/17 12:25

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### フラグ管理
2
+
1
3
  同期処理である限りは多重実行されませんが、非同期処理でしょうか。
2
4
 
3
5
  ```JavaScript
@@ -19,4 +21,20 @@
19
21
 
20
22
  ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で変更してください。
21
23
 
24
+ ### タイマー管理
25
+
26
+ > 回答いただいたところ恐縮なのですが、Errorを出すとその呼出が失敗してしまうかと思います。。呼び出しに対して実行はしないといけないのですが、同時に実行するのは避けたいというところなのです・・・。
27
+
28
+ `setTimeout` なら仕様上、排他処理されます。
29
+ 実行タイミングは**前処理が終わった直後**ですが、期待するタイミングが異なるなら自前で制御する必要があります。
30
+
31
+ ```JavaScript
32
+ function something (string) {
33
+ console.log(string);
34
+ }
35
+
36
+ setTimeout(something, 1000, 1);
37
+ setTimeout(something, 1000, 2);
38
+ ```
39
+
22
40
  Re: koyon さん

1

表現の修正

2018/06/17 04:02

投稿

think49
think49

スコア18194

answer CHANGED
@@ -17,6 +17,6 @@
17
17
  something();
18
18
  ```
19
19
 
20
- ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で行ってください。
20
+ ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で変更してください。
21
21
 
22
22
  Re: koyon さん