扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇文章为大家展示了Node.js中怎么实现串行化流程控制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联主要从事成都网站建设、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务红塔,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792串行任务:需要一个接着一个坐的任务叫做串行任务。
可以使用回调的方式让几个异步任务按顺序执行,但如果任务过多,必须组织一下,否则过多的回调嵌套会把代码搞得很乱。
为了用串行化流程控制让几个异步任务按顺序执行,需要先把这些任务按预期的执行顺序放到一个数组中,这个数组将起到队列的作用:完成一个任务后按顺序从数组中取出下一个。
数组中的每个任务都是一个函数。任务完成后应该调用一个处理器函数,告诉它错误状态和结果。
为了演示如何实现串行化流程控制,我们准备做个小程序,让它从一个随机选择的RSS预定源中获取一篇文章的标题和URL,并显示出来。
需要从npm存储苦衷下载两个辅助模块,在命令行中(以mac系统为例)输入以下命令:
mkdir random_story cd random_story npm install request npm install htmlparser
request模块是个简化的HTTP客户端,可以获取RSS数据。htmlparser模块能够把原始的RSS数据转换成JavaScript数据结构。
在新目录下创建一个random_story.js文件,包含以下代码:
var fs = require('fs'); var request = require('request'); var htmlparser = require('htmlparser'); var configFilename = './rss_feeds.txt'; //确保包含RSS订阅列表的文件存在 function checkForRSSFile() { fs.exists(configFilename, function(exists) { if (!exists) { return next(new Error('Missing RSS file: ' + configFilename)); } next(null, configFilename); }); } //读取并解析包含RSS订阅列表的文件 function readRSSFile(configFilename) { fs.readFile(configFilename, function(err, feedList) { if (err) { return next(err); } feedList = feedList.toString().replace(/^\s+|\s+$/g, '').split("\n"); var random = Math.floor(Math.random()*feedList.length); next(null, feedList[random]); }); } //向预定源发送HTTP请求以获取数据 function downloadRSSFeed(feedUrl) { request({uri: feedUrl}, function(err, res, body) { if (err) { return next(err); } if (res.statusCode !== 200) { return next(new Error('Abnormal response status code')); } next(null, body); }); } //解析到一个条目数组中 function parseRSSFeed(rss) { var handler = new htmlparser.RssHandler(); var parser = new htmlparser.Parser(handler); parser.parseComplete(rss); if (!handler.dom.items.length) { return next(new Error('No RSS items found.')); } var item = handler.dom.items.shift(); console.log(item.title); console.log(item.link); } var tasks = [ checkForRSSFile, readRSSFile, downloadRSSFeed, parseRSSFeed ]; function next(err, result) { if (err) { throw err; } var currentTask = tasks.shift(); if (currentTask) { currentTask(result); } } //开始执行串行化任务 next();
在试用这个程序之前,现在程序脚本所在的目录下创建一个rss_feeds.txt文件。这里只包含了一条预定源信息:
http://dave.smallpict.com/rss.xml
之后执行脚本:
node random_story.js
返回信息如上图。成功实现了一个串行化流程控制。
[async/await形式的串行化流程控制]
之后将源代码改写了一下,改写成ES7的async/await形式。水平有限,如有错误请指出!
let fs = require('fs'); let request = require('request'); let htmlparser = require('htmlparser'); let configFilename = './rss_feeds.txt'; function checkForRSSFile() { return new Promise((resolve, reject) => { fs.exists(configFilename, (exists) => { if (!exists) { reject(new Error('Missing RSS file: ' + configFilename)); } resolve(); }); }); } function readRSSFile(configFilename) { return new Promise((resolve, reject) => { fs.readFile(configFilename, (err, feedList) => { if (err) { reject(err); } feedList = feedList.toString().replace(/^\s+|\s+$/g, '').split("\n"); let random = Math.floor(Math.random()*feedList.length); resolve(feedList[random]); }); }); } function downloadRSSFeed(feedUrl) { return new Promise((resolve, reject) => { request({uri: feedUrl}, (err, res, body) => { if (err) { reject(err); } if (res.statusCode !== 200) { reject(new Error('Abnormal response status code')); } resolve(body); }); }); } function parseRSSFeed(rss) { let handler = new htmlparser.RssHandler(); let parser = new htmlparser.Parser(handler); parser.parseComplete(rss); if (!handler.dom.items.length) { throw new Error('No RSS items found.'); } let item = handler.dom.items.shift(); console.log(item.title); console.log(item.link); } async function getRSSFeed() { await checkForRSSFile(); let url = await readRSSFile(configFilename); let rss = await downloadRSSFeed(url); return rss; } getRSSFeed().then(rss => parseRSSFeed(rss), e => console.log(e));
上述内容就是Node.js中怎么实现串行化流程控制,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联网站建设公司行业资讯频道。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流