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中的非阻塞方法介绍
Jun 05 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
NodeJS制作爬虫全过程
Dec 22 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
详解redis在nodejs中的应用
May 02 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
Prototype使用指南之form.js
2007/01/10 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
Python的函数的一些高阶特性
2015/04/27 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python聊天室程序(基础版)
2018/04/01 Python
wxpython绘制音频效果
2019/11/18 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
python怎么提高计算速度
2020/06/11 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
python是怎么被发明的
2020/06/15 Python
如何完美的建立一个python项目
2020/10/09 Python
Python爬取某平台短视频的方法
2021/02/08 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
一道SQL存储过程面试题
2016/10/07 面试题
shell变量的作用空间是什么
2013/08/17 面试题
马智宇结婚主持词
2014/04/01 职场文书
简易离婚协议书范本
2014/10/24 职场文书
员工工作及收入证明
2014/10/28 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
董存瑞观后感
2015/06/11 职场文书