#javascript #node.js
#javascript #node.js
Вопрос:
РЕДАКТИРОВАТЬ: на самом деле я точно не уверен, имеет ли Nodejs свою собственную систему разделения данных, чтобы предотвратить возникновение такой ошибки. Поэтому мне нужно, чтобы кто-нибудь ответил мне, если я ошибаюсь.. спасибо за ваше время.
Итак, я кодирую шахматную игру в реальном времени в браузере.
Мой сервер nodejs. (Я сократил это, чтобы уменьшить время чтения)
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const port = 6969;
const server = http.createServer(express);
const wss = new WebSocket.Server({
server
});
clients = [];
// That array contains the figure positions for all users connected.
// It is array that contains arrays. EXAMPLE:
// Each user has his own userid, username, and the figure position in each array:
// clients {
// [0] = {'51', 'Diablo', '5'}
// [1] = {'84', 'Jason', '3'}
// [2] = {'15', 'Triston', '8'}
// }
// When user makes a move, a data is sent.
wss.on('connection', function connection(ws){
ws.on('message', function incoming(data){
// An user with ID 84, is sending his new figure position '13'.
data = JSON.parse(data);
// Now we need for loop in the clients array, to find the array index of the player
// with ID of 84, in order to replace the old figure position in that index with
// the new figure position.
change_figure_position(data[0]);
});
});
function change_figure_position(userid){
var user_data;
// looping trough all currently connected users.
for (var i = 0; i < clients.length; i ) {
// Upon each loop, check if the array index of 0 (the user id) matches
// with the id of the user that send data.
if(clients[i][0].includes(userid) == true){
// The user index is found! Change the figure position in that index.
clients[i][2] = data[2];
}
}
}
Приведенный выше код объясняет все это, поскольку я добавил комментарии повсюду. Код работает отлично, но моя проблема в другом. Насколько я знаю, Nodejs работает не так, как PHP. В PHP, когда пользователи продолжают выполнять код того же типа, PHP выполняет один запрос и не начинает выполнение другого, не завершив выполнение первого. Но в Nodejs все работает в режиме реального времени. Меня здесь беспокоит следующее. Поскольку Nodejs работает в режиме реального времени и не ожидает завершения первого запроса. Два пользователя могут отправлять данные одновременно.
Если пользователь отключается от моей игры, то его массив, содержащий его данные, удаляется из моей переменной clients. В этом случае номера индексов меняются. Что делать, если функция change_player_figure вызывается клиентом, в то время как другой клиент одновременно отключается? Произойдет следующее.
#current status of the clients variable
clients {
[0] = {'51', 'Diablo', '5'}
[1] = {'84', 'Jason', '3'}
[2] = {'15', 'Triston', '8'}
[3] = {'16', 'Jimmie', '5'}
}
// user Triston moves a figure
// the function finds that his index is [2]
// an user called Jason disconnects AT THE SAME TIME Triston moves a figure
#current status of the clients variable
clients {
[0] = {'51', 'Diablo', '5'}
[1] = {'15', 'Triston', '8'}
[2] = {'16', 'Jimmie', '5'}
}
// remember, Triston disconected before the function FULLY executed itself
// the function still remembers that Triston's index is [2], but now it is [1].
// so what will happen is that Jimmie's figure will be moved instead.
Это был мой вопрос. Поскольку Nodejs работает в режиме реального времени, возможны ли подобные ошибки? К сожалению, я понятия не имею, как это проверить. С одной стороны, код работает, это не значит, что все в порядке. Я должен был задать этот вопрос. Я надеюсь, что кто-то с большим опытом сможет ответить мне или дать мне совет, что мне делать, если эта ошибка возможна. Спасибо за ваше время.
Комментарии:
1. каждый оператор javascript выполняется после завершения предыдущего — точно так же, как PHP … «реальное время» не является уместным термином … если у вас были какие-то асинхронные вызовы или что-то в этом роде, то это может быть проблемой, но .. похоже, в вашем коде нет ничего подобного — код в обработчике событий является асинхронным, но это не проблема, весь код будет выполнен до того, как можно будет обработать другое событие
2. Я провожу 1 день, задаваясь вопросом, прав я или нет в своих сомнениях, но я надеюсь, что вы правы. Я еще немного почитаю и продолжу делать то, что делаю. Спасибо за ваше время.