回答編集履歴

4

連続的に実行

2018/06/17 12:29

投稿

think49
think49

スコア18164

test CHANGED
@@ -80,6 +80,16 @@
80
80
 
81
81
 
82
82
 
83
+ > どんな場面かといいますとチャットメッセージを受信して画面にappendで追加するのですが、その処理を1個ずつ追加するようにしたいのですが、ほぼ同時に関数が呼ばれるといっぺんに追加されてしまうので、それを間を置いて追加されるようにしたいのです。。
84
+
85
+
86
+
87
+ それは「同時に実行」ではなく、「処理間隔が0もしくは0に近い状態」で**連続的に実行されています**。
88
+
89
+ 関数をキュー管理してやれば、解決可能です。
90
+
91
+
92
+
83
93
  - [WindowOrWorkerGlobalScope.setTimeout() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
84
94
 
85
95
  - [キュー (コンピュータ) - 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))

3

window.setTimeout() + Queue

2018/06/17 12:29

投稿

think49
think49

スコア18164

test CHANGED
@@ -76,4 +76,70 @@
76
76
 
77
77
 
78
78
 
79
+ ### window.setTimeout() + Queue
80
+
81
+
82
+
83
+ - [WindowOrWorkerGlobalScope.setTimeout() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout)
84
+
85
+ - [キュー (コンピュータ) - 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))
86
+
87
+
88
+
89
+ ```JavaScript
90
+
91
+ const setTimeQueue = ((handleTimeout) => {
92
+
93
+ const queue = [];
94
+
95
+
96
+
97
+ return function setTimeQueue (fn, args) {
98
+
99
+ queue.push({fn: fn, args: args});
100
+
101
+
102
+
103
+ if (queue.length === 1) {
104
+
105
+ setTimeout(handleTimeout, 500, queue, 500);
106
+
107
+ }
108
+
109
+ };
110
+
111
+ })(function handleTimeout (queue, delayTime) {
112
+
113
+ const entry = queue.shift();
114
+
115
+
116
+
117
+ entry.fn(...entry.args);
118
+
119
+
120
+
121
+ if (queue.length) {
122
+
123
+ setTimeout(handleTimeout, delayTime, queue, delayTime);
124
+
125
+ }
126
+
127
+ });
128
+
129
+
130
+
131
+ const consoleLog = console.log.bind(console);
132
+
133
+
134
+
135
+ setTimeQueue(consoleLog, [1]);
136
+
137
+ setTimeQueue(consoleLog, [2]);
138
+
139
+ setTimeQueue(consoleLog, [3]);
140
+
141
+ ```
142
+
143
+
144
+
79
145
  Re: koyon さん

2

setTimeout

2018/06/17 12:25

投稿

think49
think49

スコア18164

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### フラグ管理
2
+
3
+
4
+
1
5
  同期処理である限りは多重実行されませんが、非同期処理でしょうか。
2
6
 
3
7
 
@@ -40,4 +44,36 @@
40
44
 
41
45
 
42
46
 
47
+ ### タイマー管理
48
+
49
+
50
+
51
+ > 回答いただいたところ恐縮なのですが、Errorを出すとその呼出が失敗してしまうかと思います。。呼び出しに対して実行はしないといけないのですが、同時に実行するのは避けたいというところなのです・・・。
52
+
53
+
54
+
55
+ `setTimeout` なら仕様上、排他処理されます。
56
+
57
+ 実行タイミングは**前処理が終わった直後**ですが、期待するタイミングが異なるなら自前で制御する必要があります。
58
+
59
+
60
+
61
+ ```JavaScript
62
+
63
+ function something (string) {
64
+
65
+ console.log(string);
66
+
67
+ }
68
+
69
+
70
+
71
+ setTimeout(something, 1000, 1);
72
+
73
+ setTimeout(something, 1000, 2);
74
+
75
+ ```
76
+
77
+
78
+
43
79
  Re: koyon さん

1

表現の修正

2018/06/17 04:02

投稿

think49
think49

スコア18164

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で行ってください。
39
+ ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で変更してください。
40
40
 
41
41
 
42
42