iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >详解Node.js串行化流程控制
  • 688
分享到

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

详解流程串行化 2022-06-04 17:06:38 688人浏览 安东尼
摘要

串行任务:需要一个接着一个坐的任务叫做串行任务。 可以使用回调的方式让几个异步任务按顺序执行,但如果任务过多,必须组织一下,否则过多的回调嵌套会把代码搞得很乱。 为了用串行化流程控制让几个异步任务按顺序执行

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

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

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

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

为了演示如何实现串行化流程控制,我们准备做个小程序,让它从一个随机选择的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));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 详解Node.js串行化流程控制

本文链接: https://www.lsjlt.com/news/12632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js中怎么实现串行化流程控制
    本篇文章为大家展示了Node.js中怎么实现串行化流程控制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。串行任务:需要一个接着一个坐的任务叫做串行任务。可以使用回调...
    99+
    2024-04-02
  • C#流程控制详解
    目录流程控制语句分类1、if语句2、switch3、三位运算符4、迭代语句之while语句4.1 迭代语句概述4.2 while语句5、迭代语句之do……...
    99+
    2024-04-02
  • PHP控制流程详解
    【PHP控制流程详解】 在PHP编程中,控制流程是指如何让程序按照我们所期望的顺序执行代码,通过控制流程,我们可以实现条件判断、循环执行和跳转等功能。本文将详细讨论PHP中常用的控制流...
    99+
    2024-03-11
    php 详解 控制流程
  • Python执行流程控制详情
    目录一 引子二 分支结构2.1 什么是分支结构2.2 为什么要用分支结构2.3 如何使用分支结构2.3.1 if语法2.3.2 if应用案例三 循环结构3.1 什么是循环结构3.2 ...
    99+
    2024-04-02
  • Go流程控制代码详解
    目录Go流程控制1、条件语句IF2、条件语句switch3、条件语句select4、循环语句for5、循环语句range 6、循环控制goto、break、…...
    99+
    2023-05-16
    Go流程控制代码 Go流程控制
  • 详解Java中的流程控制
    1.分支结构的概念 当需要进行条件判断并做出选择时,使用分支结构 2.if分支结构 格式: if(条件表达式){ 语句块; } package com.lagou.Day...
    99+
    2024-04-02
  • Golang流程控制语句详解
    go 语言中的流程控制语句有三种类型:条件语句、循环语句和跳跃语句。条件语句根据布尔表达式的真假值控制程序流向;循环语句用于重复执行代码块;跳跃语句用于显式控制程序流向,包括退出循环、跳...
    99+
    2024-04-03
    golang 流程控制语句
  • Python流程控制语句详解
    目录1.if判断1.1 if语句1.2 else语句1.3 elif语句2.循环2.1 while循环2.2 for循环2.3 break和continue语句3.其他1.if判断 ...
    99+
    2024-04-02
  • 一文详解C++的程序流程控制
    目录一、前言2、三目运算符3、switch语句三、循环结构1、while循环语句2、do…while循环语句3、for循环语句四、跳转语句1、break语句2、cont...
    99+
    2022-11-13
    C++程序流程控制 C++流程控制
  • Java控制流程示例代码详解
    目录用户交互Scanner、Scanner进阶使用用户交互ScannerScanner进阶使用顺序结构选择结构*if选择结构Switch选择结构循环结构*while循环do..whi...
    99+
    2024-04-02
  • 一文详解Java中流程控制语句
    目录概述判断语句ifif...elseif..else if...elseif语句和三元运算符的互换选择语句switchcase的穿透性循环语句forwhiledo...whilef...
    99+
    2024-04-02
  • python流程控制详细介绍
    目录1. 布尔逻辑1.1 条件控制语句-if1.2 if/else 语句1.3 if/elif 语句2 循环控制语句2.1 循环控制之for2.2 循环控制之while3 for v...
    99+
    2024-04-02
  • Go语言流程控制详情
    目录1、流程控制2、if 语句3、goto4、for语句5、switch1、流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。...
    99+
    2024-04-02
  • Javascript基础:运算符与流程控制详解
    目录1. 运算符(操作符)1.1 算数运算符1.2 递增和递减运算符1.3 比较运算符1.4 逻辑运算符1.5 赋值运算符1.6 运算符优先级2. 流程控制2.1 if 的语法结构2...
    99+
    2024-04-02
  • Golang中常用的流程控制语句详解
    Golang中常用的流程控制语句详解Golang作为一门面向并发的静态编程语言,提供了丰富的流程控制语句来实现复杂的逻辑和条件判断。本文将详细介绍Golang中常用的流程控制语句,包括if语句、switch语句、for语句等,并且提供具体的...
    99+
    2023-12-23
    switch语句 for循环 if条件判断
  • 详解Java中的三种流程控制语句
    目录顺序语句选择语句if else的嵌套switch case default循环语句forfor inwhiledo whilebreak continue顺序语句 顺序顾名思义就...
    99+
    2024-04-02
  • Golang通脉之流程控制详情
    目录1、if else(分支结构)1.1 if条件判断基本写法1.2 if条件判断特殊写法2、for(循环结构)2.1 无限循环3、for range(键值循环)4、switch c...
    99+
    2024-04-02
  • Go语言实战学习之流程控制详解
    目录1. 前言2. if分支3. for及for-range循环4. switch-case-fallthrough分支5. goto6. break和continue7. 跳出嵌套...
    99+
    2024-04-02
  • 一文了解Python 流程控制
    目录while 循环死循环与效率问题结束循环的方式方式一 将条件改成 False,等到下次循环在判断条件的的时候会生效方式二 break,立即终止本层循环whil...
    99+
    2024-04-02
  • Golang控制协程执行顺序方法详解
    目录循环控制通道控制互斥锁 async.Mutex在 Go 里面的协程执行实际上默认是没有严格的先后顺序的。由于 Go 语言 GPM 模型的设计理念,真正执行实际工作的实际上是 GP...
    99+
    2022-11-21
    Go控制协程执行顺序 Go执行顺序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作