国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 16:40:15
字體:
來源:轉載
供稿:網友

串行任務:需要一個接著一個坐的任務叫做串行任務。

可以使用回調的方式讓幾個異步任務按順序執行,但如果任務過多,必須組織一下,否則過多的回調嵌套會把代碼搞得很亂。

為了用串行化流程控制讓幾個異步任務按順序執行,需要先把這些任務按預期的執行順序放到一個數組中,這個數組將起到隊列的作用:完成一個任務后按順序從數組中取出下一個。

數組中的每個任務都是一個函數。任務完成后應該調用一個處理器函數,告訴它錯誤狀態和結果。

為了演示如何實現串行化流程控制,我們準備做個小程序,讓它從一個隨機選擇的RSS預定源中獲取一篇文章的標題和URL,并顯示出來。

需要從npm存儲苦衷下載兩個輔助模塊,在命令行中(以mac系統為例)輸入以下命令:

mkdir random_storycd random_storynpm install requestnpm 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));

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛南县| 宜黄县| 泽州县| 利津县| 姚安县| 清新县| 清流县| 子长县| 霍州市| 聊城市| 太保市| 沁水县| 博白县| 寻甸| 山阳县| 惠水县| 高陵县| 大悟县| 彩票| 大安市| 东源县| 徐汇区| 井研县| 北辰区| 府谷县| 临城县| 抚松县| 房山区| 林芝县| 汶川县| 四会市| 徐闻县| 广元市| 塔河县| 泽库县| 宁德市| 陆川县| 宜阳县| 日照市| 仪陇县| 广饶县|