我的回调有什么问题?

时间:2017-07-28 11:38:04

标签: javascript node.js callback

这是文件" path-info.js"它有两个功能:pathInfo&打回来。 Pathinfo从对象" info"中收集有关文件的所有信息,回调获取该对象并返回它。代码:

"use strict";
const fs = require("fs");

let getInfo = function (err, someObject) {
    if (err) throw err;
    return someObject;
};

function pathInfo(path, callback) {
  let info = {};

  info.path = path; // write path info

  fs.stat(path, (err, type) => { // write type info
    if (type.isFile()) {
      info.type = "file";
    }
    if (type.isDirectory()) {
      info.type = "directory";
    } else {
      info.type = "undefined";
    }
  });

  fs.stat(path, (err, type) => { // write content info if it is file
    if (type.isFile()) {
      fs.readFile(path, "utf8", (err, content) => {
        info.content = content;
      });
    } else {
      info.content = "undefined";
    }
  });

  fs.stat(path, (err, type) => { // write childs if it is directory
    if (type.isDirectory()) {
      fs.readdir(path, (err, childs) => {
        info.childs = childs
      });
    } else {
      info.childs = "undefined";
    }
  });

  getInfo(null, info); // callback returns object "info"
}

module.exports = pathInfo;

我使用我的回调函数,例如,在这里显示:nodeJs callbacks simple example。不过,这段代码不起作用,我不知道为什么。

我使用文件" test.js"来调用此代码,这是代码:

const pathInfo = require('./path-info');
function showInfo(err, info) {
  if (err) {
    console.log('Error occurred');
    return;
  }

  switch (info.type) {
    case 'file':
      console.log(`${info.path} — is File, contents:`);
      console.log(info.content);
      console.log('-'.repeat(10));
      break;
    case 'directory':
      console.log(`${info.path} — is Directory, child files:`);
      info.childs.forEach(name => console.log(`  ${name}`));
      console.log('-'.repeat(10));
      break;
    default:
      console.log('Is not supported');
      break;
  }
}

pathInfo(__dirname, showInfo);
pathInfo(__filename, showInfo);

所以逻辑是我需要给我的回调提供包含目录或文件的一些信息的对象。根据这一点,将显示一些console.logs。

我们将不胜感激任何帮助!

UPD :更新了代码,重新命名了我的"回调"功能到" getInfo"。

2 个答案:

答案 0 :(得分:0)

回调是您作为参数传递给另一个函数的函数。

在您的情况下,您的第二个参数是函数 showInfo ,这是您的回调。您的函数 pathInfo 接受两个参数,第二个是 showInfo

所以当你调用它时,你在 showInfo 中用一些参数执行代码,通常是错误的,然后是其他的。

在您的情况下,您将第二个参数命名为" 回调"在 showInfo 中,因此您必须使用询问的参数(错误和信息)执行它。

示例:

function myfunc (parameter,cb) {
    cb(null,{});
}

myfunc("one", function (err,res) {
    console.log(err);
});

其中" cb " in" myfunc "是作为第二个参数发送的函数。

它可以像你这样写:

var cb = function (err,res) {
    console.log(err);
}

myfunc("one",cb);

答案 1 :(得分:0)

如果有人有兴趣..我找到了解决方案,它的确有效!正如@ ADreNaLiNe-DJ正确陈述的那样,当我调用getInfo回调来返回info对象时,我的回调没有完成。因此,出路是改变我的抽象级别:我所做的就是将我的回调粘贴到函数中。看到那段代码:

"use strict";
const fs = require("fs");

let pathInfo = (path, callback) => {
  let info = {};
  info.path = path;

  fs.stat(path, (err, type) => {
    if (err) throw err;
    if (type.isFile()) {
      info.type = "file";
      fs.readFile(path, "utf8", (err, content) => {
        info.content = content;
        info.childs = undefined;
        callback(err, info);
      });
    }
    if (type.isDirectory()) {
      info.type = "directory";
      fs.readdir(path, (err, childs) => {
        info.childs = childs;
        info.content = undefined;
        callback(err, info);
      });
    }
  });
};

let showInfo = (err, info) => {     // Отсюда и ниже вставлен код из текста
  if (err) {                        // из домашнего задания
    console.log('Возникла ошибка при получении информации');
    return;
  }

  switch (info.type) {
    case 'file':
      console.log(`${info.path} — является файлом, содержимое:`);
      console.log(info.content);
      console.log('-'.repeat(10));
      break;
    case 'directory':
      console.log(`${info.path} — является папкой, список файлов и папок в ней:`);
      info.childs.forEach(name => console.log(`  ${name}`));
      console.log('-'.repeat(10));
      break;
    default:
      console.log('Данный тип узла не поддерживается');
      break;
  }
};

pathInfo(__dirname, showInfo);
pathInfo(__filename, showInfo);
PS:对不起俄罗斯的console.logs,希望它不会打扰你(他们不会带来任何价值,无论如何理解它是如何工作的)