哈哈,你妈这嵌套,你可能觉得这就是 JavaScript 异步的问题,说真的,嵌套不是 JavaScript 异步的真正问题所在。上面这段代码我们可以下面这样写:
复制代码 代码如下:
...
function ReadIPCallback(err, ips) {
if (err) {
handlerError(err)
} else {
ips2geos(ips, ips2geosCallback)
}
}
function ips2geosCallback(err, geos) {
if (err) {
handlerError(err)
} else {
geos2weathers(geos, geos2weathersCallback)
}
}
function geos2weathersCallback(err, weathers) {
if (err) {
handlerError(err)
} else {
writeWeather(weathers, writeWeatherCallback)
}
}
function writeWeatherCallback(err) {
if (err) {
handlerError(err)
} else {
console.log('success!')
}
}
readIP('./ip.json', ReadIPCallback)
好了,这是我们 callback.js 的全部内容。运行:
复制代码 代码如下:
node callback.js
将会生成 weater.json 文件:
复制代码 代码如下:
[
{
"ip": "180.153.132.38",
"weather": "Clear",
"region": "Shanghai"
},
{
"ip": "91.239.201.98",
"weather": "Clouds"
},
{
"ip": "60.28.215.115",
"weather": "Clear",
"region": "Tianjin"
},
{
"ip": "74.125.235.224",
"weather": "Clouds",
"region": "California"
},
{
"ip": "115.29.230.208",
"weather": "Clear",
"region": "Zhejiang"
}
]
那正真的问题是什么?
当然是异步的问题啦,异步本质上要处理三个事情:
1.异步操作什么时候结束,需要通知回来,Callback 是一种方案;
2.异步产生的结果需要传递回来,Callback 接受一个 data 参数,把数据传回来;
3.异步如果出错了怎么办?Callback 接受 一个 err 参数,把错误传回来。