【问题标题】:How to asynchronously call a recursive function in javascript如何在javascript中异步调用递归函数
【发布时间】:2019-02-20 13:44:52
【问题描述】:

在我尝试使用 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;

有人可以阐明执行此操作的正确方法吗? 提前致谢。

【问题讨论】:

    标签: javascript node.js asynchronous recursion socket.io


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复,已经尝试过了,但似乎也没有效果。
    • 什么时候效率不高?如果您像问题中那样执行此操作,它将以极快的速度一次又一次地搜索,直到耗尽调用堆栈空间。
    • 是的,即使设置的超时时间也是一样的。我想我必须增加间隔或更改算法。
    猜你喜欢
    • 2017-03-12
    • 2016-09-21
    • 1970-01-01
    • 2015-08-12
    • 2018-02-24
    • 2023-03-11
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多