var list = [{k:1},{k:2},{k:3},{k:4}];
for(i in list){
var item = list[i];
A.func(item,function(err,result){
//如果这个func函数耗时比较长
//我在此处如何才能获取到传进去的参数item
console.log(item);//此时输出的item,应该与传进去的不同了
});
}
还有,循环内部含有回调函数,如何等待所有回调函数执行完成再return 呢
B.func = function(list,callback){
var i = 0;
for(i in list){
var item = list[i];
A.func(item , function(err,result){
//等待全部的回调函数执行完成后再进行return
//这个应该如何实现呢
i++;
});
}
return callback(i);//在此处这样返回的i应该还是0,
};
请前辈指导!
计数、检查、通知
@tulayang 能具体一点吗,我没领悟你的意思。。。
:如何等待所有回调函数执行完成再return 呢
这个情况用 async 很适合
:console.log(item);//此时输出的item,应该与传进去的不同了
你试过没有?item 应该还在 function 的 scope 里,可以直接使用。
用 eventproxy 或者 async。推荐前者。
@leapon 我试过,输出的不是原来的值
@alsotang 谢谢,我学习下这些
输出的是原来的值
$ cat test1.js
var list = [{k:1},{k:2},{k:3},{k:4}];
for(i in list){
var item = list[i];
console.log('>>> item:', item);
Afunc(item,function(err,result){
console.log('item:', item);
});
}
function Afunc(data, callback) {
callback(null, 1);
}
$ node test1.js
>>> item: { k: 1 }
item: { k: 1 }
>>> item: { k: 2 }
item: { k: 2 }
>>> item: { k: 3 }
item: { k: 3 }
>>> item: { k: 4 }
item: { k: 4 }
@leapon 前辈,你看看,是这样子的 var list = [{k:1},{k:2},{k:3},{k:4}]; for(i in list){ var item = list[i]; console.log(’>>> item:’, item); Afunc(item,function(err,result){ console.log(‘item:’, item); }); }
function Afunc(data, callback) {
setTimeout(function(){return callback(null, 1);},1000);
}
执行结果是:
node try.js
item: { k: 1 } item: { k: 2 } item: { k: 3 } item: { k: 4 } item: { k: 4 } item: { k: 4 } item: { k: 4 } item: { k: 4 }
你的Afunc里又加了一层,那把 item 绑到里层的函数上就可以了。
@leapon 我的意思是让Afunc需要一定时间执行完成,里层只是单纯的返回阿,没关系吧
var howdo = require('howdo');
var list = [{k:1},{k:2},{k:3},{k:4}];
howdo.each(list, function(key, item, done) {
A.func(item, done);
}).together(function(err, k1, k2, k3, k4) {
// 做你该做的
});
A.func(item,function(err,result){
//如果这个func函数耗时比较长
//我在此处如何才能获取到传进去的参数item
console.log(item);//此时输出的item,应该与传进去的不同了
});
这里如果A.func是一个异步函数,则 item 始终是 list 中的最后一个,可以用一个闭包解决此问题
(function(item){
A.func(item,function(err,result){
console.log(item);//此时输出的item,应该与传进去的相同了
});
})(item);
想对一个数组执行异步函数,可以考虑 async 库中的 async.parallel,async.series,async.map 等函数
if i=length-1