摘要:前言我們以查找指定目錄下的最大文件為例,感受從回調(diào)函數(shù)異步處理方式的改變。此外,該對象還有一個方法可以判斷正在處理的到底是一個文件,還是一個目錄。如果有錯誤或者不嚴謹?shù)牡胤?,請?wù)必給予指正,十分感謝。
前言
我們以查找指定目錄下的最大文件為例,感受從
回調(diào)函數(shù) -> Promise -> Generator -> Async
異步處理方式的改變。
API 介紹為了實現(xiàn)這個功能,我們需要用到幾個 Nodejs 的 API,所以我們來簡單介紹一下。
fs.readdirreaddir 方法用于讀取目錄,返回一個包含文件和目錄的數(shù)組。
fs.statstat 方法的參數(shù)是一個文件或目錄,它產(chǎn)生一個對象,該對象包含了該文件或目錄的具體信息。此外,該對象還有一個 isFile() 方法可以判斷正在處理的到底是一個文件,還是一個目錄。
思路分析我們基本的實現(xiàn)思路就是:
用 fs.readdir 獲取指定目錄的內(nèi)容信息
循環(huán)遍歷內(nèi)容信息,使用 fs.stat 獲取該文件或者目錄的具體信息
將具體信息儲存起來
當全部儲存起來后,篩選其中的是文件的信息
遍歷比較,找出最大文件
獲取并返回最大文件
然后我們直接上代碼吧。
回調(diào)函數(shù)var fs = require("fs"); var path = require("path"); function findLargest(dir, cb) { // 讀取目錄下的所有文件 fs.readdir(dir, function(er, files) { if (er) return cb(er); var counter = files.length; var errored = false; var stats = []; files.forEach(function(file, index) { // 讀取文件信息 fs.stat(path.join(dir, file), function(er, stat) { if (errored) return; if (er) { errored = true; return cb(er); } stats[index] = stat; // 事先算好有多少個文件,讀完 1 個文件信息,計數(shù)減 1,當為 0 時,說明讀取完畢,此時執(zhí)行最終的比較操作 if (--counter == 0) { var largest = stats .filter(function(stat) { return stat.isFile() }) .reduce(function(prev, next) { if (prev.size > next.size) return prev return next }) cb(null, files[stats.indexOf(largest)]) } }) }) }) }
使用方式為:
// 查找當前目錄最大的文件 findLargest("./", function(er, filename) { if (er) return console.error(er) console.log("largest file was:", filename) });Promise
var fs = require("fs"); var path = require("path"); var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) }) } var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) }) } function findLargest(dir) { return readDir(dir) .then(function(files) { let promises = files.map(file => stat(path.join(dir, file))) return Promise.all(promises).then(function(stats) { return { stats, files } }) }) .then(data => { let largest = data.stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return data.files[data.stats.indexOf(largest)] }) }
使用方式為:
findLargest("./") .then(function(filename) { console.log("largest file was:", filename); }) .catch(function() { console.log(error); });Generator
var fs = require("fs"); var path = require("path"); var co = require("co") var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) }) } var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) }) } function* findLargest(dir) { var files = yield readDir(dir); var stats = yield files.map(function(file) { return stat(path.join(dir, file)) }) let largest = stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return files[stats.indexOf(largest)] }
使用方式為:
co(findLargest, "./") .then(function(filename) { console.log("largest file was:", filename); }) .catch(function() { console.log(error); });Async
var fs = require("fs"); var path = require("path"); var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) }) } var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) }) } async function findLargest(dir) { var files = await readDir(dir); let promises = files.map(file => stat(path.join(dir, file))) var stats = await Promise.all(promises) let largest = stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return files[stats.indexOf(largest)] }
使用方式為:
findLargest("./") .then(function(filename) { console.log("largest file was:", filename); }) .catch(function() { console.log(error); });ES6 系列
ES6 系列目錄地址:https://github.com/mqyqingfeng/Blog
ES6 系列預(yù)計寫二十篇左右,旨在加深 ES6 部分知識點的理解,重點講解塊級作用域、標簽?zāi)0?、箭頭函數(shù)、Symbol、Set、Map 以及 Promise 的模擬實現(xiàn)、模塊加載方案、異步處理等內(nèi)容。
如果有錯誤或者不嚴謹?shù)牡胤?,請?wù)必給予指正,十分感謝。如果喜歡或者有所啟發(fā),歡迎 star,對作者也是一種鼓勵。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/98677.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細介紹 HTT...
摘要:到這里,我已經(jīng)發(fā)出了一個請求買漢堡,啟動了一次交易。但是做漢堡需要時間,我不能馬上得到這個漢堡,收銀員給我一個收據(jù)來代替漢堡。到這里,收據(jù)就是一個承諾保證我最后能得到漢堡。 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步中的回調(diào)javascript異步之Promise.all()、Promise.race()、Promise.finally()javascr...
摘要:標準引入了函數(shù),使得異步操作變得更加方便。在異步處理上,函數(shù)就是函數(shù)的語法糖。在實際項目中,錯誤處理邏輯可能會很復(fù)雜,這會導(dǎo)致冗余的代碼。的出現(xiàn)使得就可以捕獲同步和異步的錯誤。如果有錯誤或者不嚴謹?shù)牡胤?,請?wù)必給予指正,十分感謝。 async ES2017 標準引入了 async 函數(shù),使得異步操作變得更加方便。 在異步處理上,async 函數(shù)就是 Generator 函數(shù)的語法糖。 ...
前言 Promise 的基本使用可以看阮一峰老師的 《ECMAScript 6 入門》。 我們來聊點其他的。 回調(diào) 說起 Promise,我們一般都會從回調(diào)或者回調(diào)地獄說起,那么使用回調(diào)到底會導(dǎo)致哪些不好的地方呢? 1. 回調(diào)嵌套 使用回調(diào),我們很有可能會將業(yè)務(wù)代碼寫成如下這種形式: doA( function(){ doB(); doC( function(){ ...
閱讀 1729·2021-11-22 12:09
閱讀 1459·2019-08-30 13:22
閱讀 2092·2019-08-29 17:00
閱讀 2642·2019-08-29 16:28
閱讀 2954·2019-08-26 13:51
閱讀 1181·2019-08-26 13:25
閱讀 3243·2019-08-26 12:14
閱讀 3014·2019-08-26 12:14