var express = require('express');
var superagent = require('superagent');
var cheerio = require('cheerio');
var eventproxy = require('eventproxy');
var url = require('url');// url 模块是 Node.js 标准库里面的
var app = express();
var cnodeurl = 'https://cnodejs.org/';
app.get('/', function(req, res, next){
superagent.get('https://cnodejs.org/')
.end(function(err, sres){
if(err){
return next(err);//It passes control to the next matching route,参数err是???
}
var $ = cheerio.load(sres.text);
var topicUrls = [];
$("#topic_list .topic_title").each(function(idx, ele){
var $ele = $(ele);
var href = $ele.attr('href');
var jumpHref = url.resolve(cnodeurl, href);
topicUrls.push(jumpHref);
})
//res.send(topicUrls);//好像res.send()必须有
// 命令 ep 重复监听 topicUrls.length 次(在这里也就是 40 次) `topic_html` 事件再行动
var ep = new eventproxy();// 得到一个 eventproxy 的实例
ep.after('topic_html', topicUrls.length, function(topics){
// topics 是个数组,包含了 40 次 ep.emit('topic_html', pair) 中的那 40 个 pair
// 在所有文件的异步执行结束后将被执行
// 所有文件的内容都存在topics数组中
//开始行动
topics = topics.map(function(topicPair){//topics里的每一个元素
var topicUrl = topicPair[0];
var topicHtml = topicPair[1];
var $ = cheerio.load(topicHtml);
return ({
title: $('.topic_full_title').text().trim(),
href: topicUrl,
comment1: $('.reply_content').eq(0).text().trim()
})
})
console.log('final: ');
console.log(topics);
});
topicUrls.forEach(function(topicUrl){
superagent.get(topicUrl)
.end(function(err, res){
console.log('fetch ' + topicUrl + ' successfully');
ep.emit('topic_html', [topicUrl, res.text])//触发事件,并且执行所有监听器
//emit 相当于jQuery里的trigger
})
}); });
});
app.listen(8000, function(){
console.log("app start");
})

https://github.com/alsotang/node-lessons/tree/master/lesson4

node lesson4--eventproxy不懂的更多相关文章

  1. node.js+mongodb 爬虫

    demo截图: 本demo爬瓜子二手车北京区的数据 (注:需要略懂 node.js / mongodb 不懂也没关系 因为我也不懂啊~~~) 之所以选择爬瓜子二手车网站有两点: 一.网站无需登录,少做 ...

  2. 复习 - node.js(接口案例)

    其实复习一次的作用真实太大了,真的,自从上次ajax开始其实就开始i有点懵懵懂懂的感觉,一直拖想到了node在去回顾一遍,这一次回去复习,ajax已经很熟练了,node之前搞不懂那些原理也顺清楚了好多 ...

  3. javascript之数据推送

    我们使用ajax与后台服务进行交互,常常是通过触发事件来单次交互,但对于有些web应用来说,需要前台与后台保持长连接,前端不定时地接收后台推送的数据信息, 例如:股票行情分析.聊天室和网页在线游戏等. ...

  4. Gauge框架在JS中的简单应用

    gauge框架简介 Gauge是一个轻量级的跨平台测试自动化工具. gauge安装[Win10 64位下测试] [百度网盘链接]https://pan.baidu.com/s/1bidE34gLLrS ...

  5. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  6. 手把手教你学node.js 之使用 eventproxy 控制并发

    使用 eventproxy 控制并发 目标 建立一个 lesson4 项目,在其中编写代码. 代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cn ...

  7. Node.js之eventproxy详解

    安装 npm install eventproxy --save 调用 var EventProxy = require('eventproxy'); 异步协作 多类型异步协作 此处以页面渲染为场景, ...

  8. node,不懂不懂

    Four Day-------------------------node.js分对象全局/核心模块/文件模块path(核心模块)--作用:操作路径basername/获取传入路劲dimame/获取传 ...

  9. node不懂的方法的使用

    1. 学习的时候注意,过滤器,上传文件sftp,读取excel,还有cookie的操作,sql的操作.node的框架express koa hapi 还有引擎ejs,hbs,jade,日志管理等,并发 ...

随机推荐

  1. 37、mipg-streamer的使用讲解

    讲解mjpg-streamer 其功能: 1.控制摄像头采集数据(通过ioctl采集数据,所有不支持CMOS,CMOS之前写驱动的时候是通过read,所有需要修改mjpg-streamer的源码或者C ...

  2. 【BZOJ 3172】单词

    [链接]h在这里写链接 [题意]     给你n个单词;     这n个单词组成了一篇文章;     问你每个单词在这篇文章中出现了多少次.     其中每个单词之间用一个逗号隔开->组成一篇文 ...

  3. WPF中实现验证码

    原文:WPF中实现验证码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79563449 W ...

  4. js进阶 12-1 jquery的鼠标事件有哪些

    js进阶 12-1 jquery的鼠标事件有哪些 一.总结 一句话总结:1+3*2+1+1,其中里面有两组移入移出,一组和click,总结就是click(3个),hover(5个),mousemove ...

  5. Mariadb配置文件优化参数(仅供参考)

    [client]#password= your_passwordport= 3306         socket= /tmp/mysql.sock!includedir /opt/local/mys ...

  6. printk()函数的总结

    我们在使用printk()函数中使用日志级别为的是使编程人员在编程过程中自定义地进行信息的输出,更加容易地掌握系统当前的状况.对程序的调试起到了很重要的作用.(下文中的日志级别和控制台日志控制级别是一 ...

  7. Windows环境搭建Web自己主动化測试框架Watir(基于Ruby)

    web自己主动化測试一直是一个比較迫切的问题 图1-1 须要安装的工具 http://railsinstaller.org/ 由于安装Ruby还须要用到其它的一些开发工具集.所以建议从站点http:/ ...

  8. keepalived.conf 配置文件小结

    vrrp_script vs_mysql_82 {     script "/etc/keepalived/checkMySQL.py -h 192.168.11.82 -P 3306&qu ...

  9. ahks

    !+F11:: newStr := clipboard ;newStr := RegExReplace(newStr, "<[^>]*>", "&quo ...

  10. [tmux] Zoom and resize to view a particular pane within tmux

    Sometimes you'll want to zoom in on a specific pane within a tmux window. We'll learn to use C-b z t ...