代码很简单,如下:
var find;
data.some(function(ip) {
client.sismember(url+':ip', ip, function(err, mem) {
!mem && (find = ip);
console.log('redis:' + find);
});
console.log(find);
return find;
});
原理很简单:
- 我先some循环一个IP数组
- 如果数组中的IP不存在redis中,我就将find赋值为当前IP
- 如果循环过程中找到了IP,我就跳出循环,不再一直查询redis
结果,代码中有两个console:
- 先循环数组数据,find一直是undefined,因此不会跳出循环
- 之后执行所有redis查询结果,并重复给find复制,并打印出来
问题:
- 首先结果不是我想要的
- 效率差,我循环100条就查询100次redis
请问如何解决?
11 回复
var find;
var howdo = require('howdo');
howdo.each(data, function(index, ip, done){
if(find){
return done(null);
}
client.sismember(url+':ip', ip, function(err, mem) {
if(err){
return done(err);
}
if(!mem){
find = ip;
console.log('redis:' + find);
}
done(null);
});
}).together(function(err){
if(err){
return console.log(err);
}
console.log(find);
});