В моей попытке создать клон omegle, используя nodejs и socket.io для целей обучения, я наткнулся на проблему, в которой я не совсем уверен, как противостоять.
Идентификатор сокета клиентов и их интересовхранится в массиве объектов.Затем я использую lodash, чтобы отфильтровать других клиентов схожих интересов.Вот где я застрял.Если нет клиентов с похожими интересами, поиск должен продолжаться до тех пор, пока один из них не будет найден.Поэтому я решил пойти с рекурсивной функцией с обратным вызовом, который при обнаружении совпадения запускает обратный вызов и, если нет, вызывает функцию снова.
Это, однако, привело меня к ошибке превышения максимального стека вызовов.Ниже приведена функция
socketApi.funcy = function(socket_id, client_interests, callback){
console.log("i am searching");
search = _.filter(socketApi.availabe,{interests:client_interests});
_.remove({socketID:socket_id});
if(search.strlen>0){
callback();
} else {
socketApi.funcy(socket_id, client_interests, callback);
}
};
А ниже приведен весь код всего этого
var socket_io = require('socket.io');
var _ = require('lodash');
var io = socket_io(3001);
var socketApi = {};
socketApi.rooms = [];
socketApi.available = [];
socketApi.taken = [];
socketApi.io = io;
socketApi.funcy = function(socket_id, client_interests, callback){
console.log("i am searching");
search = _.filter(socketApi.availabe,{interests:client_interests});
_.remove({socketID:socket_id});
if(search.strlen>0){
callback();
} else {
socketApi.funcy(socket_id, client_interests, callback);
}
};
io.on('connection',function(socket){
console.log("User connected");
socket.on('goChat', function(client_interests){
socketApi.available.push({
socketID : socket.id,
interests : client_interests
});
socket.emit('searching');
socketApi.funcy(socket.id, client_interests, function(){
console.log("okay i found a match");
});
});
socket.on('msg',function(msg){
console.log("received msg");
room = rooms[socket.id];
io.to(room).emit('msgrec',msg);
});
});
module.exports = socketApi;
Может ли кто-нибудь пролить свет на правильный способ сделать это?Заранее спасибо.