上記のfor文は並列処理な為、rooms[i]等とした場合、予期しない現象が起きてしまいます。
自分には質問者さんが「並列処理」であることが「複数の関数が同時に並行して実行されてしまう」と考えておられるように見えました。マルチスレッドが可能な言語システム上(例えばC,C++,Java,C#,Ruby,Pythonなどなど)で異なるスレッドが並行動作している場合にはおっしゃるとおり複数の関数が「同時に並行して動作する」というのは正しいです。しかしながらNodejsでは並列処理をシングルスレッドで実行する方式のため、複数の関数が同時に並行して動くことはありません。
例がイマイチよくないですが、実験のため次のようなコードを考えてみました(長ったらしくて申し訳ないです)。この例ではusersという配列を非同期に発生するイベント'join'と'say'の2つのコールバックの中で「更新」と「参照」をしています。しかしこのように書いても'join'と'say'のコールバックは同時に動くことはないので'join'のコールバックの中でusers変数の破壊的更新を行っても問題ありません。あるイベントが発生するとNodejsのランタイムからそのイベントのコールバックが起動されるのですが、そのコールバック関数の実行中に例え他のイベントが発生しても関数の実行が完了するまでは次のイベントの起動は待たされるのです。
javascript
1const users = [],
2 TIMEOUT = 5 * 1000,
3 START = +new Date(),
4 pe = new PsudoEventEmitter();
5let id_counter = 0;
6
7//---------------------------------------
8// 0.1 - 5.0 sec間隔で新規ユーザーがjoin
9//---------------------------------------
10pe.on('join', 100, 5000,
11 function () {
12 const now = +new Date(),
13 user = {
14 id: ++id_counter,
15 access_time: +new Date()
16 };
17 users.push(user);
18 console.log(elapsed(now) + ": joined " + user['id']);
19 // join後5秒以上発言のないユーザーを削除
20 for (let i = 0; i < users.length; i++) {
21 let user = users[i];
22 if (now - user['access_time'] > TIMEOUT) {
23 console.log(elapsed(now) + ": removed " + user['id']);
24 users.splice(i, 1); // usersからi番目の要素を削除
25 --i;
26 }
27 }
28 });
29
30//---------------------------------------
31// 0.1 - 1.0 sec間隔で誰かが発言
32//---------------------------------------
33pe.on('say', 100, 1000,
34 function () {
35 if (users.length == 0)
36 return;
37 const now = +new Date(),
38 index = Math.floor(Math.random() * users.length),
39 user = users[index];
40 user['access_time'] = now;
41 console.log(elapsed(now) + ": say hi from " + user['id']);
42 });
43
44function elapsed(now) {
45 let e = Math.floor((now - START) / 1000);
46 return e;
47}
48
49//-------------------------------------------
50// randomにイベントを発生させるためのutility
51//-------------------------------------------
52function PsudoEventEmitter() {
53 let events = {};
54
55 function on(name, min, max, cb) {
56 const event = { name: name, min: min, max: max, cb: cb };
57 events[name] = event;
58 register(name);
59 }
60
61 function register(name) {
62 const ev = events[name];
63 setTimeout(
64 function () { fire(name) },
65 rand(ev.min, ev.max));
66 }
67
68 function fire(name) {
69 const ev = events[name];
70 ev['cb']();
71 register(name);
72 }
73
74 function rand(low, high) {
75 return low + Math.random() * (high - low);
76 }
77
78 PsudoEventEmitter.prototype.on = on;
79}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。