中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js中怎么實現串行化流程控制

發布時間:2021-07-21 10:26:53 來源:億速云 閱讀:144 作者:Leah 欄目:web開發

本篇文章為大家展示了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

Node.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中怎么實現串行化流程控制,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

调兵山市| 北京市| 唐河县| 三河市| 长沙市| 华容县| 腾冲县| 兴和县| 尚志市| 新巴尔虎左旗| 武清区| 罗城| 周宁县| 若羌县| 旌德县| 门头沟区| 洛南县| 绥化市| 仁化县| 拉孜县| 交口县| 宁波市| 灌云县| 独山县| 大理市| 禄丰县| 习水县| 徐闻县| 蓬莱市| 安徽省| 安图县| 祁连县| 临夏县| 黄梅县| 文安县| 门源| 迁西县| 江口县| 阳泉市| 宣威市| 土默特右旗|