Maison > Article > interface Web > Exemple d'explication du traitement asynchrone sous ES6
Ce que cet article vous apporte est un exemple d'explication du traitement asynchrone sous ES6. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Avant-propos
Prenons comme exemple la recherche du fichier le plus volumineux dans un répertoire spécifié et expérimentons la fonction de rappel de
->
Modifications dans le traitement asynchrone.
Introduction à l'API
Afin d'implémenter cette fonction, nous devons utiliser plusieurs API Nodejs, alors présentons-les brièvement. La méthode
fs.readdir
readdir est utilisée pour lire un répertoire et renvoie un tableau contenant des fichiers et des répertoires.
fs.stat
Le paramètre de la méthode stat est un fichier ou un répertoire, et il génère un objet qui contient des informations spécifiques sur le fichier ou le répertoire. De plus, l'objet dispose également d'une méthode isFile() qui permet de déterminer s'il s'agit d'un fichier ou d'un répertoire en cours de traitement.
Analyse des idées
Notre idée de mise en œuvre de base est :
Utilisez fs.readdir
pour obtenir les informations sur le contenu du répertoire spécifié
Parcourez les informations sur le contenu et utilisez fs.stat
pour obtenir les informations spécifiques du fichier ou du répertoire
Enregistrez les informations spécifiques
Lorsque tous sont stockés, filtrez les informations du fichier
Parcourez et comparez pour trouver le plus gros fichier
Obtenez et renvoyez le le plus gros fichier
Puis passons directement au code.
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 个文件信息,计数减 1,当为 0 时,说明读取完毕,此时执行最终的比较操作 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)]) } }) }) }) }
s'utilise de la manière suivante :
// 查找当前目录最大的文件 findLargest('./', function(er, filename) { if (er) return console.error(er) console.log('largest file was:', filename) });
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)] }) }
s'utilise de la manière suivante :
findLargest('./') .then(function(filename) { console.log('largest file was:', filename); }) .catch(function() { console.log(error); });
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)] }
La méthode d'utilisation est :
co(findLargest, './') .then(function(filename) { console.log('largest file was:', filename); }) .catch(function() { console.log(error); });
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)] }
La méthode d'utilisation est :
findLargest('./') .then(function(filename) { console.log('largest file was:', filename); }) .catch(function() { console.log(error); });
https://github.com/mqyqingfeng/Blog
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!