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实现Websocket的数据接收与发送
Nov 19 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
让nodeJS支持ES6的词法----babel的安装和使用方法
Jul 31 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
javascript获取选中的文本的方法代码
2013/10/30 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
javascript常见用法总结
2014/05/22 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
swiper实现异形轮播效果
2019/11/28 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python设置默认编码为utf8的方法
2016/07/01 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
音乐教学随笔感言
2014/02/19 职场文书
投资协议书范本
2014/04/21 职场文书
学校就业推荐信范文
2014/05/19 职场文书
土地租赁意向书
2014/07/30 职场文书
锅炉工岗位职责
2015/02/13 职场文书
党员年终个人总结
2015/02/14 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS