2016-04-26 12 views
1

Wie kann ich diesen Code auf eine bessere Weise schreiben.bessere Art zu schreiben nodejs Funktion von readfile/Datei schreiben

var fs = require('fs'); 

var file = '/test.txt'; 
fs.readFile(file, 'utf8', function (err, txt) { 
    if (err) return console.log(err); 

    txt = txt + '\nAppended something!'; 
    fs.writeFile(myFile, txt, function (err) { 
     if(err) return console.log(err); 
     console.log('Appended text!'); 
    }); 
}); 

nehme ich mehrere Rückruf haben, dann wie können wir diesen Rückruf von Rückruf verhindern und so weiter ....

getData(function(a){ 
    getMoreData(a, function(b){ 
     getMoreData(b, function(c){ 
      getMoreData(c, function(d){ 
       getMoreData(d, function(e){ 
        ... 
       }); 
      }); 
     }); 
    }); 
}); 
+0

Wie wäre es mit fs-Versprechen? https://www.npmjs.com/package/fs-promise – GeckoTang

+0

Dank @GeckoTang, fs-Versprechen ist in Ordnung, aber wie können wir Rückruf unter Rückruf so weiter .. wie 7 oder 8 Ebene Rückruf – codeGig

+0

Wenn Sie nicht wollen Um Versprechungen zu verwenden, könnten Sie allgemeine Funktionen erstellen, um die Callback-Hölle etwas zu reduzieren. Vermutlich ist es besser Verheißungen zu verwenden – rahpuser

Antwort

6

Ich mag bluebird dafür:

Zuerst müssen 'Promisify' fs. n das Beispiel unterhalb sie direkt promisify die readFile Methode:

var readFile = Promise.promisify(require("fs").readFile); 

readFile("myfile.js", "utf8").then(function(contents) { 
    return eval(contents); 
}).then(function(result) { 
    console.log("The result of evaluating myfile.js", result); 
}).catch(SyntaxError, function(e) { 
    console.log("File had syntax error", e); 
//Catch any other error 
}).catch(function(e) { 
    console.log("Error reading file", e); 
}); 

oder:

var fs = Promise.promisifyAll(require("fs")); 
// note now you have to put 'async' after the methods like so: 
fs.readFileAsync("myfile.js", "utf8").then(function(contents) { 
    console.log(contents); 
}).catch(function(e) { 
    console.error(e.stack); 
}); 
2

Ich schlage vor, async waterfall

Ihre erste Snippet würde aussehen wie folgt:

var txt; 

async.waterfall([ 
    function(callback) { 
     fs.readFile(file, 'utf8', callback); 
    }, 
    function(txt, callback) { 
     txt = txt + '\nAppended something!'; 
     fs.writeFile(myFile, txt, callback); 
    }, 
    function(callback) { 
     console.log('Appended text!'); 
     callback(); 
    } 
], function (err, result) { 
    console.log(err) 
}); 
+0

das ist auch ein gutes, upvoted! – JordanHendrix

0

Was Du beschreibst Callback-Hölle und da ist ein Paar von intelligenten Wegen, um es zu umgehen. Ich behaupte nicht, das alles zu wissen, aber es gibt eine ganze Website namens callbackhell.com, die Sie vielleicht auschecken möchten.

Aber für die kurze Antwort, können Sie diese Dinge 1. halten Sie den Code flach tun oder Ihre Funktionen

Statt Ihre fs.readFile mit einer anonymen Funktion, nennen Sie es nennen zu schreiben und es nennen wie so

fs.readFile(file, 'utf8', function readFileCb(err, txt) { 
if (err) throw new Error(err); 

txt = txt + '\nAppended something!'; 
fs.writeFile(myFile, txt, function (err) { 
    // no need to return a console.log, just throw Error should suffice 
    if(err) throw new Error(err); 
    console.log('Appended text!'); 
}); 
}); 

2. Modularisieren Sie Ihren Code. Haben benannte Funktionen oder Bibliotheken, die genau eine Sache tun

3. Stellen Sie sicher, dass alle Fehler abgefangen werden. Du scheinst so gut zu sein, also ein großes Lob!

Sie können auch Promises, Bibliotheken wie Async Wasserfall verwenden, aber Callbacks sind ein wesentlicher Bestandteil von JavaScript und das Durchlaufen der Callback-Hölle ist nur eine Frage des Verstandes beim Schreiben Ihres Codes.

Verwandte Themen