回答編集履歴

1

文章編集

2021/12/14 11:05

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,12 +1,76 @@
1
+ 落ちてる原因って本当にメモリ不足なんですかね?
2
+
3
+
4
+
5
+ そりゃいつかはメモリ解放出来ずに死ぬとは思いますが、
6
+
1
7
  これ再帰関数みたいな無限ループみたいになってて
2
8
 
3
- スコープを作り続けるから5桁回数回るくらいまででエラー吐いて落ちるんじゃないですか
9
+ スコープを作り続けるから5桁回数回るくらいまででエラー吐いて落ちるんじゃないですか?
10
+
11
+
12
+
13
+ ---
14
+
15
+
16
+
17
+ さて、解決にあたってですが
18
+
19
+ `setInterval`が使えれば話は早いですが、
20
+
21
+ update処理の実行にもたつくと2回、3回と溜まってしまうのが悩みどころ
4
22
 
5
23
 
6
24
 
7
25
  コールバック関数の仕組みだけで
8
26
 
9
- このパターンを解消するのはちとしんどい
27
+ このパターンを解消するのはちとしんどいですね。
28
+
29
+ 骨子はこんな感じ?
30
+
31
+
32
+
33
+ ```js
34
+
35
+ const id = (() => {
36
+
37
+ let ready = true;
38
+
39
+ return setInterval(
40
+
41
+ () => {
42
+
43
+ if (!ready) return;
44
+
45
+ ready = false;
46
+
47
+ update();
48
+
49
+ setTimeout(() => ready = true, (10 * 1000));
50
+
51
+ },
52
+
53
+ 50
54
+
55
+ );
56
+
57
+ )();
58
+
59
+
60
+
61
+ // 止めたくなったらこれを実行すればお行儀よく停止できそう
62
+
63
+ process.on("SIGINT", () => {
64
+
65
+ creaInterval(id);
66
+
67
+ });
68
+
69
+ ```
70
+
71
+
72
+
73
+ そこでわかり易さ重視で
10
74
 
11
75
  Promise→async/awaitを併用したパターンで作ってみました。
12
76
 
@@ -14,9 +78,15 @@
14
78
 
15
79
  ```js
16
80
 
17
- // 覚えさせたいデータはお外のスコープ準備
81
+ // 覚えさせたいデータがあれば外のスコープに変数を準備
18
82
 
19
- const state = {};
83
+ const state = {
84
+
85
+ foo: null,
86
+
87
+ update: true,
88
+
89
+ };
20
90
 
21
91
 
22
92
 
@@ -34,7 +104,9 @@
34
104
 
35
105
  const hoge = new HogeHoge(options);
36
106
 
107
+
108
+
37
- state.hoge.push(hoge.awesomeCalc());
109
+ state.foo.push(hoge.awesomeCalc());
38
110
 
39
111
  }
40
112
 
@@ -56,7 +128,7 @@
56
128
 
57
129
  (async () => {
58
130
 
59
- while (true) {
131
+ while (state.update) {
60
132
 
61
133
  // await Promiseインスタンスと記述すると、
62
134
 
@@ -70,10 +142,20 @@
70
142
 
71
143
  })();
72
144
 
145
+
146
+
147
+ process.on("SIGINT", () => {
148
+
149
+ state.update = false;
150
+
151
+ });
152
+
73
153
  ```
74
154
 
75
155
 
76
156
 
77
- こうすればスープがネスしないので
157
+ JS・Node.jsのガベージレクトの動作対象は参照の切れた値
78
158
 
159
+ こうすればスコープがネストせず自然に参照が切れるので、
160
+
79
- いずれガベージコレクトのお掃除で消えてなくなるかと思います。
161
+ hoge達はいずれガベージコレクトのお掃除で消えてなくなるかと思います。