回答編集履歴
4
連続的に実行
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
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
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
表現の修正
answer
CHANGED
@@ -17,6 +17,6 @@
|
|
17
17
|
something();
|
18
18
|
```
|
19
19
|
|
20
|
-
ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で
|
20
|
+
ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で変更してください。
|
21
21
|
|
22
22
|
Re: koyon さん
|