当从一个对象传递函数作为同一对象的另一个函数中的回调时获取未定义
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(异步)函数,并将以下内容传递到同一对象的参数中:
- 文件路径(data.persistent.paths.srcRoot)
- 编码方案(data.volatile.modularVariables.encoding.utf8)
- 回调函数(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
备注:
- 在聚合器代码中,我尝试不将“数据”传递给回调
- 我尝试传递“err”,但说它未定义
- 我试过不向 CB 传递任何东西
结论:
谁能指出我做错了什么以及为什么?
我无法从评论中得知您是否已解决错误,但我有一些建议可能会有所帮助。
聚合器代码
我注意到您在该代码中发送 callback 并传入 data
对象,该对象分配给 err
参数和 data
参数将是未定义的:
testing() {
data.volatile.modularVariables.read(
data.persistent.paths.srcRoot,
data.volatile.modularVariables.encoding.utf8,
data.volatile.modularVariables.readCB(data)
);
}
传入回调函数时,只需指定回调函数名称如下。 NodeJS 将使用适当的 err
和 data
参数调用回调。我相信这应该可以解决您的问题。
testing() {
data.volatile.modularVariables.read(
data.persistent.paths.srcRoot,
data.volatile.modularVariables.encoding.utf8,
data.volatile.modularVariables.readCB
);
}
变量命名
可以帮助其他人阅读您的代码并发现问题而无需 运行 代码的一件事是确保您没有同名变量。我相信您正试图在回调函数之外引用 data
对象,但在回调函数的范围内, data
将主要作为传入的参数被引用(请参阅 scope ).当我 运行 你的代码时,调试器告诉我 data
在应用上面的修复之前是未定义的。之后,它告诉我 data
是一个空字符串。
为此,您可以将 data
对象更改为 myData
或 cypherData
之类的名称,它不会与您的任何其他 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
);
我不了解 JS 和 JS in Node RTE。但是我尝试将简单的函数编写为对象中的箭头函数以供以后使用。这些箭头函数之一 (data.volatile.modularVariables.read) 从 FileSystem 节点本机模块调用 readFile(异步)函数,并将以下内容传递到同一对象的参数中:
- 文件路径(data.persistent.paths.srcRoot)
- 编码方案(data.volatile.modularVariables.encoding.utf8)
- 回调函数(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
备注:
- 在聚合器代码中,我尝试不将“数据”传递给回调
- 我尝试传递“err”,但说它未定义
- 我试过不向 CB 传递任何东西
结论:
谁能指出我做错了什么以及为什么?
我无法从评论中得知您是否已解决错误,但我有一些建议可能会有所帮助。
聚合器代码
我注意到您在该代码中发送 callback 并传入 data
对象,该对象分配给 err
参数和 data
参数将是未定义的:
testing() {
data.volatile.modularVariables.read(
data.persistent.paths.srcRoot,
data.volatile.modularVariables.encoding.utf8,
data.volatile.modularVariables.readCB(data)
);
}
传入回调函数时,只需指定回调函数名称如下。 NodeJS 将使用适当的 err
和 data
参数调用回调。我相信这应该可以解决您的问题。
testing() {
data.volatile.modularVariables.read(
data.persistent.paths.srcRoot,
data.volatile.modularVariables.encoding.utf8,
data.volatile.modularVariables.readCB
);
}
变量命名
可以帮助其他人阅读您的代码并发现问题而无需 运行 代码的一件事是确保您没有同名变量。我相信您正试图在回调函数之外引用 data
对象,但在回调函数的范围内, data
将主要作为传入的参数被引用(请参阅 scope ).当我 运行 你的代码时,调试器告诉我 data
在应用上面的修复之前是未定义的。之后,它告诉我 data
是一个空字符串。
为此,您可以将 data
对象更改为 myData
或 cypherData
之类的名称,它不会与您的任何其他 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
);