異步函數的串行執行流程

w.png

/**

* 實現串行化流程控制

*

*/

const fs = require('fs')

const request = require('request')

const htmlparser = require('htmlparser')

const configFileName = './rss_feeds.txt'

//檢查文件是否存在,確保文件沒問題.

function checkForRSSFile(){

    fs.exists(configFileName,(err,exist)=>{

        if(!exist){

            return next(new Error(`missing RSS file ${configFileName}`))

        }

        next(null,configFileName)

    })

}

//讀取文件內容

function readRSSFile(configFileName){

    fs.readFile(configFileName,(err,feedList)=>{

        if(err){

            next(err)

            return

        }

        feedList = feedList.toString()

                    .replace(/^\s+|\s+$/g,'')

                    .split('\n')

        let random = Math.floor(Math.random() * feedList.length)

        next(null,feedList[random])           

    })

}

function downloadRSSFeed(feedUrl){

    request({url:feedUrl},(err,response,body) =>{

        if(err) next(err)

        if(response.statusCode != 200){

            return next(new Error('abnormal response status code.'))

        }

        next(null,body)

    })

}

var tasts = [

    checkForRSSFile,

    readRSSFile,

    downloadRSSFeed

]

function next(err,result){

    if(err) throw err //往上拋出異常

    let currentTask = tasts.shift() //返回數組一個元素,并且刪除

    if(currentTask){ //如果判斷函數存在

        currentTask(result) //執行函數

    }

}

next() //開始執行當前任務

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容