Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的回电怎么了?_Javascript_Node.js_Callback - Fatal编程技术网

Javascript 我的回电怎么了?

Javascript 我的回电怎么了?,javascript,node.js,callback,Javascript,Node.js,Callback,这是文件“path info.js”,它有两个函数:pathInfo和callback。Pathinfo从对象“info”中的路径收集有关文件的所有信息,回调获取该对象并返回它。代码: "use strict"; const fs = require("fs"); let getInfo = function (err, someObject) { if (err) throw err; return someObject; }; function pathInfo(path

这是文件“path info.js”,它有两个函数:pathInfo和callback。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;
我使用的回调函数如图所示,例如,这里:。不过,这段代码不起作用,我也不知道为什么

我使用文件“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.log

任何帮助都将不胜感激


UPD:更新了代码,将我的“回调”函数重命名为“getInfo”。A回调是作为参数传递给另一个函数的函数

在您的例子中,第二个参数是functionshowInfo,它是您的回调函数。函数pathInfo接受两个参数,第二个参数是showInfo

因此,当您调用它时,您会使用一些参数执行showInfo中的代码,这些参数通常是err,然后是其他参数

在本例中,您在showInfo
中命名第二个参数“callback”,因此必须使用所请求的参数(err和info)执行它

例如:

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

myfunc("one", function (err,res) {
    console.log(err);
});
其中“myfunc”中的“cb”是作为第二个参数发送的函数

它可以这样写,因为你这样做:

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

myfunc("one",cb);

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

在您的例子中,第二个参数是functionshowInfo,它是您的回调函数。函数pathInfo接受两个参数,第二个参数是showInfo

因此,当您调用它时,您会使用一些参数执行showInfo中的代码,这些参数通常是err,然后是其他参数

在本例中,您在showInfo
中命名第二个参数“callback”,因此必须使用所请求的参数(err和info)执行它

例如:

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

myfunc("one", function (err,res) {
    console.log(err);
});
其中“myfunc”中的“cb”是作为第二个参数发送的函数

它可以这样写,因为你这样做:

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

myfunc("one",cb);

万一有人感兴趣。。我找到了一个解决方案,它是有效的!正如@ADreNaLiNe DJ正确指出的,当我调用getInfo callback返回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,希望它不会打扰您(它们对理解它的工作原理没有任何价值)

以防有人感兴趣。。我找到了一个解决方案,它是有效的!正如@ADreNaLiNe DJ正确指出的,当我调用getInfo callback返回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,希望它不会打扰您(它们不会给理解它的工作原理带来任何价值)

Define“不工作”。这是因为您在
path info.js
中声明了一个名为
callback
的变量。重命名它将解决您的问题。您收到了什么错误消息?@DaveNewton此时写着“不受支持”,但我100%确定应该有另一个console.log(不是默认情况…)@ADreNaLiNe DJ将其重命名为“getInfo”(只是另一个名称),仍然不起作用..定义“不工作”。这是因为您在
path info.js
中声明了一个名为
callback
的变量。重命名它将解决您的问题。您收到了什么错误消息?@DaveNewton此时写着“不受支持”,但我100%确定应该有另一个console.log(不是默认情况…)@ADreNaLiNe DJ将其重命名为“getInfo”(只是另一个名称),仍然不起作用。。