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

最新文章

  1. C#编程模式之扩展命令
  2. Vue#表单控件绑定
  3. <context:component-scan>使用说明
  4. linux下用eclipse + GDBserver + JLINK 在线调试(ARM11)
  5. SqlServer和MySQL游标学习
  6. Partial Tree---hdu5534(完全背包)
  7. dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)
  8. java中的IO整理
  9. 编程算法 - 最长上升子序列问题 代码(C)
  10. eclipse主题插件
  11. Java日期格式化方法
  12. JAVA并发编程实战---第二章:线程安全性
  13. Loadrunner结果分析中连接图没有数据的设置
  14. vue源码分析—数据绑定
  15. mybatis 批量查询参数语句
  16. bzoj1912 树形dp求直径(新写法),求直径的两端点
  17. MVC微型框架---------学习
  18. Django Web最小框架
  19. MVC异步分页
  20. 五、Mosquitto 高级应用之权限管理

热门文章

  1. Angular7环境搭建报错
  2. 8.6 Android灯光系统_源码分析_背光灯
  3. swift项目第二天:初始化项目
  4. Linux环境编程之共享内存区(一):共享内存区简单介绍
  5. Cocos2dx 小技巧(十六)再谈visit(getDescription)
  6. MongoDB集群安装与配置2.4.3版本
  7. 【b601】能量项链
  8. 【9204】第k小整数
  9. Spring Tool Suite(STS)加速
  10. 段的创建表user_segments 分类: H2_ORACLE 2013-08-10 11:13 714人阅读 评论(0) 收藏