现在有一个需求,有一个二位数组[[a,b,c],[e,f,g],[h,i,j],[k,l,m]],另外有一个数N,求出结果 [[a-N,b-N,c-N],[e-N,f-N,g-N],[h-N,i-N,j-N],[k-N,l-N,m-N]], 请问用async.map怎么实现? 上面可能不涉及回掉函数,实际场景是这样 有一个中心点center,有一组天已经分好天[[a,b,c],[e,f,g],[h,i,j],[k,l,m]],有一个path的数据库保存着点到中心点之间的交通信息。现在需要遍历数组, 查询出数据库的信息,组合成新的带有交通信息的数组输出出来。
用数组的map就行了,和aysnc无关
@Vizwind async可以写回掉函数,我是在实际情况,需要对数据库操作中遇到这种问题。
@moJiXiang 嵌套两层 async.map 不就好了吗?
@alsotang 具体情况我更新了,我先试试嵌套能否解决,谢谢。
我搞过一个类似的,写得像屎一样…… auto有几个步骤,最后一步对一个结果进行each遍历。在遍历过程中又有几个步骤,最后一步又对一个结果进行each遍历。忘了还有没有第三个嵌套循环。 重点是有些步骤有提前结束所有任务(不是出错哦),比如说查了数据库,发觉 user 是天灾的成员,好了,后面的不用做了,不得不用 callback(‘break’, result) 这样丑陋的方法解决。 更蛋疼的是,如果查了数据库,user 是天灾的话执行一种逻辑,是近卫的执行一种逻辑……额,我崩溃了…… 求大神怎么破
@gvforjob do友阿!能不能贴段代码,看看!
先把二位数组变成一维,再用aysnc.map遍历不就行了
@Vizwind 嗯,现在就这么做
var list= [0, 1, 2];
var howdo = require('hodwo');
howdo.each(list, function(index, val, done){
// do sth
// done 提交结果,可以放在异步回调里
done(err, ret);
}).together(function(err, ret0, ret1, ret2){
// together 为顺序并行,结果和 list 顺序一样
// do sth
});
类似这样子,如果嵌套了几层循环的逻辑会非常难看 如果遇到一些提前跳转的话,我用了‘break’这么丑陋的写法 如果遇到的是分支的话,if(a)执行task2,否则(下面是跳出)执行task3,代码会更难看 想到好点的方法是将逻辑拆开,放到不同的函数里,不过函数拆开了会变得多很多,读起来也不是非常直观
async.auto({ ‘task1’: function(cb) { if (a) {cb(‘break’);} else {cb(null, [o1, o2, o3]);} } ‘task2’: [‘task1’, function(cb, results) { async.each(results.task1, function(item, callback) { // 这里面再嵌套一两层这样的逻辑吧 callback(null, null); }, function(err) { cb(err, ‘the result’); } } , function(err, results) { if (err) { if (err === ‘break’) {do something} else {throw err} } else { do something } }