nodejsは非同期的にファイルを巡回しました.

7798 ワード

nodejsは同期して再帰的にファイルを巡回するのはとても簡単で、非同期的に再帰的に巡回するのは少し複雑になりました.
非同期巡回は、ローズマリーのような方法で行うことができます.まず一つの方法を定義します.コールバック関数は三つのパラメータを持っています.それぞれ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();
});