nodejs中sleep功能实现暂停几秒的方法


Posted in NodeJs onJuly 12, 2017

我在网上了解了一下nodejs中sleep功能,搜索了很多关于nodejs中sleep功能介绍,下面我来记录一下,有需要了解的朋友可参考。希望此文章对各位有所帮助。

一 背景

在使用nodejs爬虫的时候,经常会遇到别人的网站对频率的反爬机制,这个时候如果不做处理程序就会挂掉,重新启动也会继续被屏蔽.这个问题怎么解决呢,我的想法就是程序暂停10分钟或者更长的时间,继续爬取.

二 方法

其实使用setTimeout就可以实现,只是nodejs异步已经很金字塔了,再加一层会更恐怖,所以本文使用nodejs的第三方模块async来实现,async的目的就是让多个异步的程序,按照开发者想要的顺序来执行,代码书写符合同步风格,其实运行还是异步的,也解决了回调金字塔的问题.

async基础使用 :https://3water.com/article/118526.htm

三 正常代码

访问3个网站,百度,优酷,腾讯为例.不暂停的代码.

var async = require('async'); 
var http = require('http'); 
var task = []; 
task.push(function(callback){ 
 console.time('访问3个网站时间统计'); 
 http.get('http://www.baidu.com/', function(res) {  
  console.log("百度访问结果: " + res.statusCode);  
  callback(null); 
 }).on('error', function(e) {  
  console.log("百度访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
task.push(function(callback){ 
 http.get('http://www.youku.com/', function(res) {  
  console.log("优酷访问结果: " + res.statusCode); 
  callback(null); 
 }).on('error', function(e) { 
  console.log("优酷访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
task.push(function(callback){ 
 http.get('http://www.qq.com/', function(res) {  
  console.log("腾讯访问结果: " + res.statusCode); 
  callback(null); 
 }).on('error', function(e) {  
  console.log("腾讯访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
async.waterfall(task, function(err,result){ 
 console.timeEnd('访问3个网站时间统计'); 
 if(err) return console.log(err); 
 console.log('全部访问成功'); 
})

四 测试

nodejs中sleep功能实现暂停几秒的方法

执行访问网站需要时间,3个网站访问时间统计254ms.

五 暂停代码

比如,访问第一个网站后暂停5秒,访问第二个网站后暂停10秒.

var async = require('async'); 
var http = require('http'); 
var task = []; 
task.push(function(callback){ 
 console.time('访问3个网站时间统计'); 
 http.get('http://www.baidu.com/', function(res) {  
  console.log("百度访问结果: " + res.statusCode); 
  setTimeout(function() { 
   callback(null); 
  }, 5000); 
 }).on('error', function(e) {  
  console.log("百度访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
task.push(function(callback){ 
 http.get('http://www.youku.com/', function(res) {  
  console.log("优酷访问结果: " + res.statusCode); 
  setTimeout(function() { 
   callback(null); 
  }, 10000); 
 }).on('error', function(e) { 
  console.log("优酷访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
task.push(function(callback){ 
 http.get('http://www.qq.com/', function(res) {  
  console.log("腾讯访问结果: " + res.statusCode); 
  callback(null); 
 }).on('error', function(e) {  
  console.log("腾讯访问结果: " + e.message); 
  callback(e); 
 }); 
}) 
 
async.waterfall(task, function(err,result){ 
 console.timeEnd('访问3个网站时间统计'); 
 if(err) return console.log(err); 
 console.log('全部访问成功'); 
})

六 测试

nodejs中sleep功能实现暂停几秒的方法

从打印中能看得出,访问第二个网站等待了5秒,访问第三个网站等待了10秒.OK!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 #NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 #NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 #NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 #NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 #NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 #NodeJs
Nodejs之http的表单提交
Jul 07 #NodeJs
You might like
php创建session的方法实例详解
2015/01/27 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
简单谈谈python中的Queue与多进程
2016/08/25 Python
windows下ipython的安装与使用详解
2016/10/20 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
2019/08/08 Python
python返回数组的索引实例
2019/11/28 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
打架检讨书500字
2014/01/29 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
共青团员自我评价
2015/03/10 职场文书
教学质量月活动总结
2015/05/11 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python