【已解决】调用async.map如何传递获得的结果?
发布于 10 年前 作者 Sperak 10608 次浏览 最后一次编辑是 8 年前

众所周知,map可以把一个数组中的项每个变量遍历一遍,执行同一个异步操作,然后将结果存到最后的回调函数中。 例如: async.map([‘file1’,‘file2’,‘file3’], fs.stat, function(err, results){ // results就是最终返回的数据 }); 但是我现在遇到这样一个问题,我得到了一个数组,但是数组里面的数据有些是我错误的,所以我调用了一个方法getExistAdLocPage。在方法getExistAdLocPage中,我使用了map来对数组中的每一项进行分析(例如:数组中的数据是url,我用request来分析是否真的存在这些url,判断他们是不是404),然后给数组中的数据添加了一个状态,若是存在,stat=true, 否则就stat=false. 代码如下:

var getExistAdLocPage = function(data, callback){
	async.map(data,function(item,callback) {
		var name = item['name'];
		var result = item['url'];
		if(result.indexOf("502 Bad Gateway") > -1) {
			callback(null,{"stat":"webfail","name":name});
		} else if(result.indexOf("404-1") > -1) {
			callback(null,{"stat":"page not exist","name":name});
		} else if(result.indexOf("404 Not Found") > - 1) {
			callback(null,{"stat":"page not exist","name":name});
		} else if(result.indexOf("<!DOCTYPE") > - 1){
			callback(null,{"stat":"page not exist","name":name});
		} else if(result.indexOf("403 Forbidden") > - 1){
			callback(null,{"stat":"page not exist","name":name});
		} else {
			callback(null,{"stat":"success","name":name,"data":result});
		}
	},function(err,result) {
		console.log(result);		
	});
}

我的问题是如何把result中的数据传给我的调用函数。是在async.map外面包一层callback吗?怎么包?谢谢大家

1 回复

已解决,这个问题其实是对异步调用不熟悉导致的。在异步调用中,要明白数据是不能向同步中那样传来传去的,每个数据的传递操作都是callback来callback回去,这边只要把最后一行的console.log(result)改成callback(err,result)即可。当然要记得调用getExistAdLocPage的时候记得写callback函数,如 getExistAdLocPage([{data:“1”,name:“abc”}],function(err,data){ console.log(data); });

回到顶部