2016-09-12 4 views
1

たとえば、異なる場所にfs.readdir、fs.copyなどの2つまたは3つの独立した部分があるnodejsプログラムを作成したいとしますが、3つのアクションのすべてがこのようなJSONファイル:それへ前のアクションが最初に実行された後nodejsで非同期プログラムを書くには?

var fs = require('fs-extra'); 

var jsd = { 
    "act1" : false, 
    "act2" : false, 
    "act3" : false 
} 

fs.readdir(path1, function (err, files) { 
    if (err) jsd.act1 = err; 
    for (x in files) console.log(files[x]); 
    jsd.act1 = true; 
}); 

fs.copy(path2, path3, function (err) { 
    if (err) jsd.act2 = err; 
    jsd.act2 = true; 
}); 

fs.remove(path4, function (err) { 
    if (err) jsd.act3 = err; 
    jsd.act3 = true; 
}); 

// all three of the above actions are independent, so it makes sense that all of them are executed asynchronously. 
// Now we write jsd object to a json file; jsd's contents are dependent on the above actions though 

fs.writeJson("./data.json", jsd, function (err, files) { 
    if (err) return console.error(err); 
}); 

どのように私は、正しいデータがファイルdata.jsonに入力されていることを確認しない、すなわちfs.writeJsonを実行しますか?

私は1つの方法を知っているが、それらの巣のすべて、すなわち、

readdir() { 
    copy() { 
    remove() { 
     writeJson(); 
    } 
    } 
} 

にある。しかし、これは、コールバック地獄をもたらすことができるので、これを行うには良い方法はありますか?

あなたが約束を使用する場合はまず、あなたはこのように約束にすべてのコールバック関数を変換する必要があり、約束またはモジュールの非同期、 を使用することができます
+0

これは非同期で行う必要がありますか?これは、あなたが物事を並行してやっているということを意味しません。これらのfs関数の同期バージョンを使用して、よりシンプルにすることができます。 –

+0

約束。あなたは約束を見ましたか? –

+0

確かに、私はこれらの同期バージョンについて知っていますが、これらの非同期プロパティを使用しないでください。ノードが知られています – user3248186

答えて

0

const reddir = function(path) { 
    return new Promise((resolve, reject) => { 
    fs.readdir(path, (err, files) => { 
     if (err) return reject(err); 
     for (x in files) console.log(files[x]); 
     resolve(true); 
    }); 
    }) 
} 

、あなたは

Promise.all([reddir(path1), copy(path2, path3), remove(path4)]) 
    .spread((act1, act2, act3) => { //.spread is bluebird feature 
    return writeJson(./data.json); 
    }) 
    .catch(e => { 
    // all error can handled in this 
    }) 

を使用することができます非同期モジュールを使用する場合は、次のように記述できます。

async.parallel({ 
    act1: function(cb){ 
    fs.reddir(path1, (err, files) => { 
     if (err) return cb(err); 
     for (x in files) console.log(files[x]); 
     cb(true); 
    }) 
    }, 
    act2: ... 
},(err, jsd) => { // jsd will be {act1: true, act2: ...} 
    if (err) return console.error(err); // handle all above error here; 
    fs.writeJson("./data.json", jsd, function (err, files) { 
    if (err) return console.error(err); 
    }); 
}) 
関連する問題