Nodejs FileReads同步到异步

时间:2013-07-31 18:45:39

标签: node.js asynchronous file-io fs

我基本上有两个功能:

  1. 一个人阅读文件(帖子):loadPost(name)
  2. 一个人阅读所有文件:loadPosts()
  3. 显然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;
    }
    

2 个答案:

答案 0 :(得分:1)

您需要使用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);
    });
  });
}

答案 1 :(得分: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);