function geos2weathers(geos, callback) {
var weathers = []
var geo
var remain = geos.length
for (var i = 0; i < geos.length; i++) {
geo = geos[i];
(function(geo) {
geo2weather(geo.latitude, geo.longitude, function(err, weather) {
if (err) {
callback(err)
} else {
weather.geo = geo
weathers.push(weather)
remain--
}
if (remain == 0) {
callback(null, weathers)
}
})
})(geo)
}
}
...
ips2geos 和 geos2weathers 都使用了一种比较原始的方法,remain 来计算等待返回的个数,remain 为 0 表示并行请求结束,将处理结果装进一个数组返回。
最后就是将结果写入到 weather.json 文件中:
复制代码 代码如下:
...
function writeWeather(weathers, callback) {
var output = []
var weather
for (var i = 0; i < weathers.length; i++) {
weather = weathers[i]
output.push({
ip: weather.geo.ip,
weather: weather.weather[0].main,
region: weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), callback)
}
...
组合上面这些函数,我们就可以实现我们的目标:
复制代码 代码如下:
...
function handlerError(err) {
console.log('error: ' + err)
}
readIP('./ip.json', function(err, ips) {
if (err) {
handlerError(err)
} else {
ips2geos(ips, function(err, geos) {
if (err) {
handlerError(err)
} else {
geos2weathers(geos, function(err, weathers) {
if (err) {
handlerError(err)
} else {
writeWeather(weathers, function(err) {
if (err) {
handlerError(err)
} else {
console.log('success!')
}
})
}
})
}
})
}
})