欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Node.js中怎么實(shí)現(xiàn)串行化流程控制

本篇文章為大家展示了Node.js中怎么實(shí)現(xiàn)串行化流程控制,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出青州免費(fèi)做網(wǎng)站回饋大家。

串行任務(wù):需要一個(gè)接著一個(gè)坐的任務(wù)叫做串行任務(wù)。

可以使用回調(diào)的方式讓幾個(gè)異步任務(wù)按順序執(zhí)行,但如果任務(wù)過多,必須組織一下,否則過多的回調(diào)嵌套會(huì)把代碼搞得很亂。

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

數(shù)組中的每個(gè)任務(wù)都是一個(gè)函數(shù)。任務(wù)完成后應(yīng)該調(diào)用一個(gè)處理器函數(shù),告訴它錯(cuò)誤狀態(tài)和結(jié)果。

為了演示如何實(shí)現(xiàn)串行化流程控制,我們準(zhǔn)備做個(gè)小程序,讓它從一個(gè)隨機(jī)選擇的RSS預(yù)定源中獲取一篇文章的標(biāo)題和URL,并顯示出來。

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

mkdir random_story
cd random_story
npm install request
npm install htmlparser

request模塊是個(gè)簡化的HTTP客戶端,可以獲取RSS數(shù)據(jù)。htmlparser模塊能夠把原始的RSS數(shù)據(jù)轉(zhuǎn)換成JavaScript數(shù)據(jù)結(jié)構(gòu)。

在新目錄下創(chuàng)建一個(gè)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]);
  });
}
//向預(yù)定源發(fā)送HTTP請求以獲取數(shù)據(jù)
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);
  });
}
//解析到一個(gè)條目數(shù)組中
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);
  }
}
//開始執(zhí)行串行化任務(wù)
next();

在試用這個(gè)程序之前,現(xiàn)在程序腳本所在的目錄下創(chuàng)建一個(gè)rss_feeds.txt文件。這里只包含了一條預(yù)定源信息:

http://dave.smallpict.com/rss.xml

之后執(zhí)行腳本:

node random_story.js

Node.js中怎么實(shí)現(xiàn)串行化流程控制

返回信息如上圖。成功實(shí)現(xiàn)了一個(gè)串行化流程控制。

[async/await形式的串行化流程控制]

之后將源代碼改寫了一下,改寫成ES7的async/await形式。水平有限,如有錯(cuò)誤請指出!

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));

上述內(nèi)容就是Node.js中怎么實(shí)現(xiàn)串行化流程控制,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:Node.js中怎么實(shí)現(xiàn)串行化流程控制
文章URL:http://chinadenli.net/article36/gghhpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站手機(jī)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈用戶體驗(yàn)移動(dòng)網(wǎng)站建設(shè)網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化