关于node.js循环内的回调函数,请前辈指导
发布于 10 年前 作者 zhangwei19940824 9787 次浏览 最后一次编辑是 8 年前 来自 问答
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,
};

请前辈指导!

14 回复

计数、检查、通知

@tulayang 能具体一点吗,我没领悟你的意思。。。

:如何等待所有回调函数执行完成再return 呢

这个情况用 async 很适合

:console.log(item);//此时输出的item,应该与传进去的不同了

你试过没有?item 应该还在 function 的 scope 里,可以直接使用。

用 eventproxy 或者 async。推荐前者。

@leapon 我试过,输出的不是原来的值

@alsotang 谢谢,我学习下这些

@zhangwei19940824

输出的是原来的值

$ 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 等函数

回到顶部