nodejsは非同期的にファイルを巡回しました.
7798 ワード
nodejsは同期して再帰的にファイルを巡回するのはとても簡単で、非同期的に再帰的に巡回するのは少し複雑になりました.
非同期巡回は、ローズマリーのような方法で行うことができます.まず一つの方法を定義します.コールバック関数は三つのパラメータを持っています.それぞれerr、file、nextです.
非同期巡回は、ローズマリーのような方法で行うことができます.まず一つの方法を定義します.コールバック関数は三つのパラメータを持っています.それぞれerr、file、nextです.
function travelSync(dir, callback){
}
/**
*
*/
travelSync('E:/runs', function (e, file, next) {
//
console.log(file);
//
next();
});
一つのフォルダを巡回した後、次のファイルを巡回する必要があります.現在のディレクトリが完了した後、親レベルのフォルダがあれば、親レベルのフォルダを巡回します.次のファイルを巡回したとどう判断しますか?現在のエルゴード位置を特定し、現在のディレクトリを巡回した後、次のフォルダを巡回する必要があります.RAvelSyncの内部で、現在位置を記録するためのパラメータiを定義し、RAvelSyncにパラメータfinishを追加して、現在のディレクトリを配置するために使用します.
function travelSync(dir, callback, finish){
fs.readdir(dir, function (e, files) {
// i
function next(i) {
// i >= files ,
if(i < files.length){
}else{
finish && finish();
}
};
});
}
現在はディレクトリを巡回して再帰的に呼び出されていますが、現在の位置はパッケージを通してトラックSyncのfinishパラメータに渡されます.サブディレクトリが巡回された後、finishを実行して次のファイルを巡回しました.オブジェクトをファイルとして巡回した場合は、ファイルオブジェクトと現在の遍歴位置をコールバックに転送し、コールバック処理が完了したら、nextは次のファイルを巡回します.i>=filesの場合は、現在のフォルダが遍歴完了し、親レベルのディレクトリを経てfinishを実行する方法を示しています.ここでは、finishは再帰的な呼び出しの時に伝わってくる方法であり、実際のfinish方法の内部ではnext(i)を呼び出しています.ファーストコール時にfinishメソッドが入ってこないので、finishが存在するかどうかを判断します.
function travelSync(dir, callback, finish){
fs.readdir(dir, function (e, files) {
// i
(function next(i) {
// i >= files ,
if(i < files.length){
var pathname = path.join(dir, files[i]);
if(fs.stat(pathname, function (e, stats) {
if(stats.isDirectory()){
travelSync(pathname, callback, function () {
next(i + 1);
});
}else{
callback(e, pathname, function () {
next(i + 1);
});
}
}));
}else{
/**
* i >= files.length , ,
* , next(i)
*/
finish && finish();
}
})(0);
});
}
travelSync('E:/runs', function (e, file, next) {
//
console.log(file);
//
next();
});
これで正常にファイルを巡回することができます.以下は完了コードです.var fs = require('fs');
var path = require('path');
function travelSync(dir, callback, finish){
fs.readdir(dir, function (e, files) {
if (e === null) {
// i
(function next(i) {
// i >= files ,
if(i < files.length){
var pathname = path.join(dir, files[i]);
if(fs.stat(pathname, function (e, stats) {
if(stats.isDirectory()){
travelSync(pathname, callback, function () {
next(i + 1);
});
}else{
callback(e, pathname, function () {
next(i + 1);
});
}
}));
}else{
/**
* i >= files.length , ,
* , next(i)
*/
finish && finish();
}
})(0);
}else{
callback(e);
}
});
}
travelSync('E:/runs', function (e, file, next) {
if(e !== null){
console.log(e);
}
console.log(file);
// next next(i)
next();
});