当从一个对象传递函数作为同一对象的另一个函数中的回调时获取未定义

Getting Undefined When Passing Function From An Object As Callback Within Another Function From Same Object

我不了解 JS 和 JS in Node RTE。但是我尝试将简单的函数编写为对象中的箭头函数以供以后使用。这些箭头函数之一 (data.volatile.modularVariables.read) 从 FileSystem 节点本机模块调用 readFile(异步)函数,并将以下内容传递到同一对象的参数中:

  1. 文件路径(data.persistent.paths.srcRoot)
  2. 编码方案(data.volatile.modularVariables.encoding.utf8)
  3. 回调函数(data.volatile.modularVariables.readCB)<-问题在这里

相关代码(对象):

var data = 
{
    persistent:
    {
        states:
        {
            //exempt for question clarity
        },
        paths:
        {
            srcRoot: './vortex/root.txt'
        }
    },
    volatile:
    {
        //much of the data exempt for question clarity
        modularVariables:
        {
            encoding: {utf8:'utf8',hex:'hex',base64:'base64',BIN:(data,encoding)=>{Buffer.from(data,encoding)}},
            readCB: (err,data)=>{if(err){console.log(`%c${data.volatile.debug.debugStrings.errCodes.read}: Error reading from file`,'color: red'); console.log(data);}},
            writeCB: (err)=>{if(err){console.log(`%c${data.volatile.debug.debugStrings.errCodes.write}: Error writing to file`, 'color:red')}},
            read: (file,encoding,cb)=>{fs.readFile(file,encoding,cb)}, //cb = readCB  READ file srcRoot, pass into root(rootHash,encoding)
            write: (file,data,cb)=>{fs.writeFile(file,data,cb)}, //cb = writeCB
            checkInit: (symbol)=>{if(typeof symbol !== undefined){return symbol}} 
        },
        debug: 
        {
            functions:
            {
                append: 
                {
                    testProg:{program:{main:'system.node.upgrade'}}
                }
            },
            debugStrings:
            {
                errCodes:
                {
                    read: 'AFTERNET ERR 000',
                    write: 'AFTERNET ERR 001',
                }
            }
        }
    }
};

聚合器代码:

    testing()
    {
        data.volatile.modularVariables.read(data.persistent.paths.srcRoot,data.volatile.modularVariables.encoding.utf8,data.volatile.modularVariables.readCB(data));
    };

终端错误:

readCB: (err,data)=>{if(err){console.log(`%c${data.volatile.debug.debugStrings.errCodes.read}: Error reading from file`,'color: red'); console.log(data);}},
                                                               ^

TypeError: Cannot read property 'volatile' of undefined

备注:

结论:

谁能指出我做错了什么以及为什么?

我无法从评论中得知您是否已解决错误,但我有一些建议可能会有所帮助。


聚合器代码

我注意到您在该代码中发送 callback 并传入 data 对象,该对象分配给 err 参数和 data 参数将是未定义的:

testing() {
  data.volatile.modularVariables.read(
    data.persistent.paths.srcRoot,
    data.volatile.modularVariables.encoding.utf8,
    data.volatile.modularVariables.readCB(data)
  );
}

传入回调函数时,只需指定回调函数名称如下。 NodeJS 将使用适当的 errdata 参数调用回调。我相信这应该可以解决您的问题。

testing() {
  data.volatile.modularVariables.read(
    data.persistent.paths.srcRoot,
    data.volatile.modularVariables.encoding.utf8,
    data.volatile.modularVariables.readCB
  );
}

变量命名

可以帮助其他人阅读您的代码并发现问题而无需 运行 代码的一件事是确保您没有同名变量。我相信您正试图在回调函数之外引用 data 对象,但在回调函数的范围内, data 将主要作为传入的参数被引用(请参阅 scope ).当我 运行 你的代码时,调试器告诉我 data 在应用上面的修复之前是未定义的。之后,它告诉我 data 是一个空字符串。

为此,您可以将 data 对象更改为 myDatacypherData 之类的名称,它不会与您的任何其他 variables/parameters 冲突.


完整解决方案

var cypherData = {
  persistent: {
    states: {
      //exempt for question clarity
    },
    paths: {
      srcRoot: "./vortex/root.txt"
    }
  },
  volatile: {
    //much of the data exempt for question clarity
    modularVariables: {
      encoding: {
        utf8: "utf8",
        hex: "hex",
        base64: "base64",
        BIN: (data, encoding) => {
          Buffer.from(data, encoding);
        }
      },
      readCB: (err, data) => {
        console.log(data);
        if (err) {
          console.log(
            `%c${data.volatile.debug.debugStrings.errCodes.read}: Error reading from file`,
            "color: red"
          );
        }
      },
      writeCB: (err) => {
        if (err) {
          console.log(
            `%c${data.volatile.debug.debugStrings.errCodes.write}: Error writing to file`,
            "color:red"
          );
        }
      },
      read: (file, encoding, cb) => {
        fs.readFile(file, encoding, cb);
      }, //cb = readCB  READ file srcRoot, pass into root(rootHash,encoding)
      write: (file, data, cb) => {
        fs.writeFile(file, data, cb);
      }, //cb = writeCB
      checkInit: (symbol) => {
        if (typeof symbol !== undefined) {
          return symbol;
        }
      }
    },
    debug: {
      functions: {
        append: {
          testProg: { program: { main: "system.node.upgrade" } }
        }
      },
      debugStrings: {
        errCodes: {
          read: "AFTERNET ERR 000",
          write: "AFTERNET ERR 001"
        }
      }
    }
  }
};
cypherData.volatile.modularVariables.read(
  cypherData.persistent.paths.srcRoot,
  cypherData.volatile.modularVariables.encoding.utf8,
  cypherData.volatile.modularVariables.readCB
);