Nodejs FileReads 同步到异步

Posted

技术标签:

【中文标题】Nodejs FileReads 同步到异步【英文标题】:Nodejs FileReads Sync to Async 【发布时间】:2013-08-01 10:51:24 【问题描述】:

我基本上有两个功能:

    一个读文件(post):loadPost(name) 一个读取所有文件:loadPosts()

显然loadPosts() 调用loadPost(name)

两者都返回最终的 html

理想情况下我应该异步编写它。

问题是:我不知道如何异步处理,因为我需要等到文件完全读取后才能继续。

这是我的同步解决方案:

function loadPost(name)
    var post = fs.readFileSync("_posts/"+name,'utf8');
    // Convert Markdown to html
    var marked = mark(post);
    return marked;


function loadPosts()
    var files = fs.readdirSync("_posts/");
    var html;
    for(var i = 0; i < files.length ; i++)
        html += loadPost(files[i]);
    
    return html;

【问题讨论】:

【参考方案1】:

类似这样的东西,不需要第三方库。真的很简单。

/*jshint node:true */

function loadPosts(callback) 
    'use strict';

    var allHtml = ''; //Declare an html results variable within the closure, so we can collect it all within the functions defined within this function

    fs.readdir("_posts/", function (err, files) 

        function loadPost(name) 
            fs.read("_posts/" + name, 'utf8', function (err, data) 

                allHtml += mark(data);//Append the data from the file to our html results variable

                if (files.length) 
                    loadPost(files.pop()); //If we have more files, launch another async read.
                 else 
                    callback(allHtml); //If we're out of files to read, send us back to program flow, using the html we gathered as a function parameter
                
            );
        

        loadPost(files.pop());
    );


function doSomethingWithHtml(html) 
    'use strict';
    console.log(html);


loadPosts(doSomethingWithHtml);

【讨论】:

【参考方案2】:

您会希望使用async.js 包让您的生活更轻松。

function loadPost(name, callback) 
  fs.readFile("_posts/+"name,encoding:'utf8',function(err, data) 
    if(err) return callback(err);
    // convert markdown to html
    var marked = mark(post);
    callback(false, marked);
  );


function loadPosts(cb) 
  fs.readdir("_posts/", function(err, dir) 
    if(err) return cb(err);
    var html;
    async.eachSeries(dir, function(one, callback) 
      loadPost(one, function(err, post) 
        if(err) return cb(err);
        html += post;
        callback(false);
      );
    ,
    // final callback
    function(err) 
      if(err)  console.log(err); cb(true); return; 
      cb(false, html);
    );
  );

【讨论】:

这也可以,虽然恕我直言异步在这里有点矫枉过正,这是一个相当简单的例子。

以上是关于Nodejs FileReads 同步到异步的主要内容,如果未能解决你的问题,请参考以下文章

nodejs异步到同步

如何在nodejs中结合同步和异步功能

nodejs是同步还是异步

NodeJs, javascript: .forEach 似乎是异步的?需要同步

nodejs异步数据库功能需要同步回答

如何在nodejs中获得同步readline,或使用异步“模拟”它?