2016-09-12 20 views
1

Sagen wir zum Beispiel, ich möchte ein Nodejs-Programm schreiben, wo ich zwei oder drei unabhängige Teile wie fs.readdir, fs.copy, etc. an verschiedenen Orten, aber das Ergebnis alle drei Aktionen an a gesendet werden soll jSON-Datei wie folgt aus:Wie schreibe ich ein asynchrones Programm mit 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); 
}); 

Wie kann ich sicherstellen, dass die richtigen Daten in die Datei eingetragen wird data.json, dh fs.writeJson ausführt, nachdem die Aktionen vorherigen, um es zuerst ausgeführt werden?

Ich kenne einen Weg zum Nest ist von allen, das heißt,

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

Aber in Callback-Hölle führen kann, so gibt es einen besseren Weg, dies zu tun?

+0

Müssen Sie dies asynchron tun? Dies bedeutet nicht, dass Sie Dinge parallel tun. Sie können die Sync-Version dieser fs-Funktionen verwenden und es einfacher machen. –

+0

verspricht. Hast du Versprechen gesehen? –

+0

ja, ich weiß über synchrone Versionen von denen, aber dann werde ich nicht die asynchronen Eigenschaften dieser verwenden, für die Knoten für – user3248186

Antwort

0

kann Ihnen versprechen, oder Modul async verwenden, wenn Sie versprechen verwenden, müssen Sie zuerst alle Callback-Funktion in Versprechen wie folgt konvertieren:

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); 
    }); 
    }) 
} 

dann können Sie

verwenden
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 
    }) 

Wenn Sie ein asynchrones Modul verwenden, können Sie wie folgt schreiben:

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); 
    }); 
}) 
Verwandte Themen