如何返回此对象,而不是记录它?

时间:2014-10-17 11:15:57

标签: javascript node.js

我有一个静态站点生成器,我想在其中列出templates/partials文件夹中的所有可用部分。我需要将partials列表格式化为以下类型的对象:

var partials = {
  'header': 'partials/header', // from './templates/partials/header.html'
  'footer': 'partials/footer' // from './templates/partials/footer.html'
};

我已按照this example整理此节点脚本:

'use strict';

/**
 * Dependencies
 */

var fs = require("fs");
var path = require("path");
var p = 'templates/partials';

/**
 * Scan folder and return object with partials
 */

fs.readdir(p, function (err, files) {
  var obj = {};

  if (err) {
    throw err;
  };

  for (var i = 0; i < files.length; i++) {
    obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
  };

  console.log(obj);
});

从项目的根目录执行时,它会记录:

{ footer: 'partials/footer.html',
  header: 'partials/header.html' }

哪个好,但我想退回它,而不是记录它。我也明白我写的东西是相当笨重的。所以我的问题是,如何返回对象,以及如何使其更加健壮?

2 个答案:

答案 0 :(得分:1)

您应该提供回调函数:

function readfiles(callback) {
  fs.readdir(p, function (err, files) {
    var obj = {};

    if (err) {
      throw err;
    };

    for (var i = 0; i < files.length; i++) {
      obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
    };

    callback(obj);
  });
}

这将使用如下:

readfiles(function(files) {
  // Do stuff with files here.
});

回调函数允许IO异步完成;这通常为代码提供了很大的加速,因为它不需要等待IO完成。在这种情况下,它不是那么有用,但回调模式在Node.js中很常见,因此在这里使用它是一种很好的做法。

答案 1 :(得分:1)

var results = fs.readdir(p, function(err, files) {
  var obj = {};

  if (err) {
    throw err;
  };

  for (var i = 0; i < files.length; i++) {
    obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
  };

  // derectly deal with it here
  deal(obj);
});

或者你可以考虑异步:

async.waterfall([

    function(cb) {
      fs.readdir(p, cb)
    },
    function(files, cb) {
      for (var i = 0; i < files.length; i++) {
        obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
      }
      cb(null, obj);
    }
  ],
  function(err, obj) {
    if (err) {
      throw err;
    }

    // do somethin else
  }
);

或者您想要同步返回:

var files = fs.readdirSync(p);
for (var i = 0; i < files.length; i++) {
  obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};

// here's your obj
obj;

阅读文档了解更多详情:http://nodejs.org/api/fs.html