繁体   English   中英

如何在JavaScript中异步调用递归函数

[英]How to asynchronously call a recursive function in javascript

在我出于学习目的使用nodejs和socket.io创建omegle克隆的尝试中,我偶然发现了一个我不确定如何应对的问题。

客户端的套接字ID及其兴趣存储在对象数组中。 然后,我使用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;

有人可以阐明正确的方法吗? 提前致谢。

如果我正确理解您的目标,则您将尝试无限期搜索,直到找到匹配的客户。 如果是这种情况,我会添加一个较小的超时,以便在再次尝试之前等待一秒钟:

if(search.strlen>0){
    callback();
} else {
    setTimeout(socketApi.funcy(socket_id, client_interests, callback), 1000);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM