Node.js的那些坑(二)——异步方法里无法获取外部参数
2016-12-23 17:21
507 查看
序
在Node.js中,大量的方法(如网络相关的方法)都是异步方法。这对于习惯了传统同步代码的程序员来说,充满了太多"神奇"的现象。
本文要解决的问题是,如何让异步方法获取外部的参数。
有问题的写法:
下面是一个简单的例子。假设有一个异步的网络调用方法,然后循环调用N次,在控制台上输出调用的次数。
神奇的运行结果:
天啊,为什么会这样呢!?
纠起原因,都是异步惹得祸。就是在网络调用资源并回调之前,就已经完成了i的全部循环。
所以在第一次输出i值时,就已经变成11了。
下面给出这个问题的解决方案。
问题的解决方案:
用简短的两个字总结这个问题的解决方案——闭包。
以下是需要修改的循环调用部分的源代码:
通过JavaScript的闭包语法,将循环变量i传递给了参数index。
这样,在控制台输出时,就是传入参数时i的值。
最终的运行结果:
0
1
4
5
8
6
3
2
7
9
10
可以看到,结果是乱序的。
这也是因为网络请求异步的原因,每次网络请求的时间是不一样的,时快时慢。
所以最终输出的第几次也不是按顺序来的。
最后,非常感谢小红帮助解答了该问题。
在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
可以看到,结果是乱序的。
这也是因为网络请求异步的原因,每次网络请求的时间是不一样的,时快时慢。
所以最终输出的第几次也不是按顺序来的。
最后,非常感谢小红帮助解答了该问题。
相关文章推荐
- Node.js的那些坑(三)——如何在异步方法都执行后再执行
- Node.js express获取参数有三种方法
- Node.js的那些坑(四)——如何让异步并发方法同步顺序执行
- AngularJS $http 异步后台无法获取请求参数
- Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
- AngularJS出现$http异步后台无法获取请求参数问题的解决方法
- node.js获取参数的常用方法(总结)
- Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
- Node.js express获取参数有三种方法
- Node.js express获取参数有三种方法
- nodejs Express 4.x req.body req.query req.params 三种获取参数的方法
- node.js获取请求参数的方法和文件上传
- 转:获取网页URL地址及参数等的两种方法(js和C#)
- url参数的设置、获取、删除(js stringobject replace方法的使用)
- JS获取URL参数方法
- js获取url参数的几种方法
- Dnode:基于Node.js给浏览器提供异步远程方法调用
- JS 获取 url 参数的几种方法
- js 获取函数的所有参数和遍历JavaScript某个对象所有的属性名称和值的方法
- 引用 js中常用方法-去除字符串空格,各类型验证,获取url参数等