簡體   English   中英

如何返回此對象,而不是記錄它?

[英]How do I return this object, instead of logging it?

我有一個靜態網站生成器,我想為其列出templates/partials文件夾中的所有可用部分。 我需要將部分列表的格式設置為以下類型的對象:

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

我已經按照以下示例將以下節點腳本放在一起:

'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' }

這很好,但是我想返回它,而不是記錄它。 我也覺得我寫的東西很笨拙。 所以我的問題是,如何返回對象,以及如何使它更堅固?

您應該提供一個回調函數:

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中非常常見,因此在這里使用它是一個好習慣。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM