回答編集履歴
4
連続的に実行
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
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
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
表現の修正
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
|
37
37
|
|
38
38
|
|
39
|
-
ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で
|
39
|
+
ご存知とは思いますが、変数 `executed` の処理中フラグは**非同期処理が完了したタイミング**で変更してください。
|
40
40
|
|
41
41
|
|
42
42
|
|