您的位置:首页 > Web前端 > Node.js

Node.js的那些坑(二)——异步方法里无法获取外部参数

2016-12-23 17:21 507 查看


在Node.js中,大量的方法(如网络相关的方法)都是异步方法。这对于习惯了传统同步代码的程序员来说,充满了太多"神奇"的现象。

本文要解决的问题是,如何让异步方法获取外部的参数。

有问题的写法:

下面是一个简单的例子。假设有一个异步的网络调用方法,然后循环调用N次,在控制台上输出调用的次数。

var request = require('request');

// 异步获取网络资源的方法
getWeb = (index, getCallback) => {
var url = 'http://www.duzixi.com';

request(url, function (error, response, body) {
if (!error && response.statusCode == 200)
{
getCallback(body);
return body;

} else {
console.log(response.statusCode + " " + error);
getCallback("");
return "";
}
})
}

// 循环调用
for (var i = 0; i <= 10; i++) {
getWeb(i, (body)=>{
console.log(i);
})
}


神奇的运行结果:

11
11
11
11
11
11
11
11
11
11


天啊,为什么会这样呢!?

纠起原因,都是异步惹得祸。就是在网络调用资源并回调之前,就已经完成了i的全部循环。

所以在第一次输出i值时,就已经变成11了。

下面给出这个问题的解决方案。

问题的解决方案:

用简短的两个字总结这个问题的解决方案——闭包。

以下是需要修改的循环调用部分的源代码:

// 循环调用
for (var i = 0; i <= 10; i++) {
((index)=>{
getWeb(index, (body)=>{
console.log(index);
})
})(i)
}


通过JavaScript的闭包语法,将循环变量i传递给了参数index。

这样,在控制台输出时,就是传入参数时i的值。

最终的运行结果:

0
1
4
5
8
6
3
2
7
9
10

可以看到,结果是乱序的。
这也是因为网络请求异步的原因,每次网络请求的时间是不一样的,时快时慢。

所以最终输出的第几次也不是按顺序来的。

最后,非常感谢小红帮助解答了该问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: