全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解Node.js串行化流程控制

串行任务:需要一个接着一个坐的任务叫做串行任务。

可以使用回调的方式让几个异步任务按顺序执行,但如果任务过多,必须组织一下,否则过多的回调嵌套会把代码搞得很乱。

为了用串行化流程控制让几个异步任务按顺序执行,需要先把这些任务按预期的执行顺序放到一个数组中,这个数组将起到队列的作用:完成一个任务后按顺序从数组中取出下一个。

数组中的每个任务都是一个函数。任务完成后应该调用一个处理器函数,告诉它错误状态和结果。

为了演示如何实现串行化流程控制,我们准备做个小程序,让它从一个随机选择的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串行化流程控制  # nodejs  # 流程控制  # node  # Javascript基础:运算符与流程控制详解  # 原生js中运算符及流程控制示例详解  # Javascript异步流程控制之串行执行详解  # js数据类型转换与流程控制操作实例分析  # javascript流程控制语句集合  # JavaScript基础之流程控制语句的用法  # 浅谈JavaScript中的分支结构  # JavaScript流程控制(分支)  # 组中  # 串行化  # 几个  # 创建一个  # 回调  # 都是  # 是个  # 目录下  # 如有  # 数据结构  # 得很  # 做个  # 写了  # 可以使用  # 为例  # 会把  # 让它  # 后将  # 先把  # 转换成 


相关文章: 如何用已有域名快速搭建网站?  如何在Golang中指定模块版本_使用go.mod控制版本号  红河网站制作公司,红河事业单位身份证如何上传?  建站之星好吗?新手能否轻松上手建站?  建站之星如何修改网站生成路径?  如何在云主机上快速搭建网站?  如何彻底卸载建站之星软件?  如何用花生壳三步快速搭建专属网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  想学网站制作怎么学,建立一个网站要花费多少?  详解jQuery停止动画——stop()方法的使用  宝塔面板如何快速创建新站点?  网站制作公司排行榜,抖音怎样做个人官方网站  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何高效完成独享虚拟主机建站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  如何获取上海专业网站定制建站电话?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何续费美橙建站之星域名及服务?  如何快速生成橙子建站落地页链接?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星客服服务时间及联系方式如何?  威客平台建站流程解析:高效搭建教程与设计优化方案  教程网站设计制作软件,怎么创建自己的一个网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  ,sp开头的版面叫什么?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  建站之星×万网:智能建站系统+自助建站平台一键生成  网站制作难吗安全吗,做一个网站需要多久时间?  MySQL查询结果复制到新表的方法(更新、插入)  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何获取免费开源的自助建站系统源码?  定制建站哪家更专业可靠?推荐榜单揭晓  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  济南专业网站制作公司,济南信息工程学校怎么样?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站之星3.0如何解决常见操作问题?  ,怎么用自己头像做动态表情包?  如何在Windows 2008云服务器安全搭建网站?  如何选择高效响应式自助建站源码系统?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  C#如何在一个XML文件中查找并替换文本内容  建站ABC备案流程中有哪些关键注意事项? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。