Как асинхронно вызывать рекурсивную функцию в JavaScript - PullRequest
0 голосов
/ 16 сентября 2018

В моей попытке создать клон 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;

Может ли кто-нибудь пролить свет на правильный способ сделать это?Заранее спасибо.

1 Ответ

0 голосов
/ 16 сентября 2018

если я правильно понимаю вашу цель, вы пытаетесь искать бесконечно, пока не найдете подходящего клиента.Если это так, я бы добавил небольшой тайм-аут, чтобы он подождал секунду, прежде чем повторить попытку:

if(search.strlen>0){
    callback();
} else {
    setTimeout(socketApi.funcy(socket_id, client_interests, callback), 1000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...