javascript - 如何在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);
}
推荐阅读
- r - 数据框r和grepl中的两个条件
- c# - 在 SignalR 中将用户添加到 Hub 组
- python - 使用 Dialogflow Python API 在 Dialogflow 代理内创建知识库的问题
- javascript - jQuery - 不允许加载本地资源
- javascript - ReactJs:如何在 RegionDropdown 中选择默认值
- javascript - 在远程方法 beforeRemote 钩子上的 Loopback 中发送回响应
- angular - 按日期持续时间的角度过滤器数组
- hive - 如何在蜂巢中以驼峰形式保留列名
- java - Bean 名称“...”的 BindingResult 和普通目标对象都不能用作请求属性
- formatting - WebStorm 装饰器参数中不需要的缩进