CNode

请教关于node异步循环的问题

问答
Yyuchen发布于12 年前最后回复12 年前11 回复7719 浏览0 收藏

代码很简单,如下:

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)

N
ngot#1·12 年前

不知所云

1
119786155#2·12 年前

楼主是否需要如下两个函数?:

函数1):检查指定的IP数组是否存在于redis中,返回所有不存在于redis中的IP数组: 函数2):将指定的IP数组存放于redis中

C
cool-l#3·12 年前

async.js async.parallelLimit(...) 不知是否能解决你的问题

C
chrome10086#6·12 年前

两个办法 要么转同步 . 要么回调函数里加上状态判断 . 建议第二种方式 .

A
alsotang#7·12 年前
D
DevinXian#8·12 年前
引用 alsotanghttps://github.com/alsotang/async demo 来学习一下 async

@alsotang @yuchen 一直在使用async,偶尔用用EventProxy,都很强大~step好简单的API,没有前两者完备

C
cwallow#9·12 年前

async.mapSeries将执行转成同步,可以试试

C
cloudcome#10·12 年前
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);
});
Y
yuchen#11·12 年前
引用 cloudcome

@cloudcome 谢谢

参与回复
登录后即可参与回复。登录