Node.js-序列化流程式控制制

來源:互聯網
上載者:User

標籤:uri   隨機播放   next   nod   log   流程   nbsp   訂閱   實現   

內容主要來源:吳海星譯,《Node.js實戰》。

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

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

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

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

為了示範如何?序列化流程式控制制,我們準備做個小程式,讓它從一個隨機播放的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));

 

Node.js-序列化流程式控制制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.