Javascript 写读/写文件的nodejs函数的更好方法

Javascript 写读/写文件的nodejs函数的更好方法,javascript,node.js,express,Javascript,Node.js,Express,如何以更好的方式编写此代码 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) {

如何以更好的方式编写此代码

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!');
    });
});
假设我有多个回调,那么我们如何防止回调的回调,等等

getData(function(a){  
    getMoreData(a, function(b){
        getMoreData(b, function(c){ 
            getMoreData(c, function(d){ 
                getMoreData(d, function(e){ 
                    ...
                });
            });
        });
    });
});
我真的很喜欢这个:

首先,你必须“承诺”财政司司长。在下面的示例中,它们直接说明了readFile方法:

或:

我真的很喜欢这个:

首先,你必须“承诺”财政司司长。在下面的示例中,它们直接说明了readFile方法:

或:

我建议

您的第一个代码段如下所示:

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)
});
我建议

您的第一个代码段如下所示:

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

你所描述的是回调地狱,有几种聪明的方法可以绕过它。我并不声称自己是无所不知的人,但有一个完整的网站,你可能想去看看

但简单地说,你可以做这些事情 1.保持代码浅显,或命名函数

与其使用匿名函数编写fs.readFile,不如将其命名并像这样调用它

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!');
 });
});   
二,。模块化您的代码。具有只做一件事的命名函数或库

function writeFile(file, txt, cb){
  fs.writeFile(file, txt, cb)
}

function writeFileCb(err){
 if(err) throw new Error(err);
 console.log('Appended Text!');
}

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

 txt = txt + '\nAppended something!';
 writeFile(myFile, txt, writeFileCb);
});   
三,。确保捕获所有错误。你似乎做得很好,太好了


您也可以使用承诺、库(如异步瀑布),但回调是JavaScript的一个重要部分,通过回调地狱只是编写代码的一个问题。

您所描述的是回调地狱,有两种聪明的方法可以绕过它。我并不声称自己是无所不知的人,但有一个完整的网站,你可能想去看看

但简单地说,你可以做这些事情 1.保持代码浅显,或命名函数

与其使用匿名函数编写fs.readFile,不如将其命名并像这样调用它

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!');
 });
});   
二,。模块化您的代码。具有只做一件事的命名函数或库

function writeFile(file, txt, cb){
  fs.writeFile(file, txt, cb)
}

function writeFileCb(err){
 if(err) throw new Error(err);
 console.log('Appended Text!');
}

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

 txt = txt + '\nAppended something!';
 writeFile(myFile, txt, writeFileCb);
});   
三,。确保捕获所有错误。你似乎做得很好,太好了


您也可以使用Promission,比如Async瀑布库,但是回调是JavaScript的一个重要部分,经历回调地狱只是编写代码的一个问题。

fs promise怎么样?谢谢@GeckoTang,fs承诺很好,但我们如何防止回调下的回调,等等。。就像7级或8级回调一样,如果不想使用承诺,可以创建一个通用函数来减少一点回调。可能最好使用PromisesforInstance,即回调地狱的示例。。如果你只想在一个文件中追加,你可以使用fs.appendfilefs promise呢?谢谢@GeckoTang,fs承诺很好,但我们如何防止回调下的回调,等等。。就像7级或8级回调一样,如果不想使用承诺,可以创建一个通用函数来减少一点回调。可能最好使用PromisesforInstance,即回调地狱的示例。。可以使用递归阻止,具体取决于您正在执行的操作。如果您只想在一个文件中追加,则可以使用fs.appendFile