node.js - 非同期処理 - イベントループ スレッド




node.jsのForループと非同期コールバック? (2)

1つの方法は、クロージャを使用するためにループの内部を書き換えることです。

fs.readdir(SYNCDIR, function(err1, files) {
    var filesOnly = [];
    if(!err1) {
        for(var i = 0; i < files.length; i++) {
            (function(index) {
                var imgFilePath = SYNCDIR + '/' + files[index];
                fs.stat(imgFilePath, function(stat){
                    if (stat.isFile()){
                        filesOnly[index] = stat;
                    }
                });
            })(i);
        }
    }
});

Array.prototype.forEachを使用して、同じ結果を得る、より見栄えの良い例:

fs.readdir(SYNCDIR, function(err1, files) {
    var filesOnly = [];
    if(!err1) {
        files.forEach(function(file, i) {
            var imgFilePath = SYNCDIR + '/' + file;
            fs.stat(imgFilePath, function(stat){
                if (stat.isFile()){
                    filesOnly[i] = stat;
                }
            });
        });
    }
});

私はJavaScriptとnode.jsの新機能です 私はディレクトリをループし、ファイルstat(他のディレクトリではない)を配列に追加したい。 以下のように私のコードには問題があります。なぜならコールバックはおそらくforループが終了した後に呼び出されるため、コールバックメソッドの "i" -variableを使うと動作しません。 しかし、以下のスニペットが機能するようにコードをどのように見えるべきですか? それは閉鎖と関係がありますか?

手伝ってくれてありがとう!

    fs.readdir(SYNCDIR, function(err1, files) {
        var filesOnly = [];

        if(!err1) {

            for(var i = 0; i < files.length; i++) {

                var imgFilePath = SYNCDIR + '/' + files[i];
                fs.stat(imgFilePath, function(stat){

                    if (stat.isFile()){
                        filesOnly[i] = stat; // This will not be correct since the for-loop has finished
                    }
                });

            }
        }
    });

あなたはクロージャーを使う必要があるとあなたは正しいです。 各繰り返しに対してiの値を保持するには、 forループの内容を自己呼び出し関数にラップする必要があります。

fs.readdir(SYNCDIR, function(err1, files) {
    var filesOnly = [];

    if(!err1) {

        for(var i = 0; i < files.length; i++) {

            (function(i) {
                var imgFilePath = SYNCDIR + '/' + files[i];
                fs.stat(imgFilePath, function(stat){
                    if (stat.isFile()){
                        filesOnly[i] = stat;
                    }
                });
            })(i);

        }
    }
});






asynccallback