我正在开发一个函数,用于根据过去的内容读取 JSON 文件并返回值。在实际函数中,我可以完全按照我的预期输出到控制台,但是当我将其返回然后输出到控制台时,我得到了未定义的结果。
我正在使用的 JSON 文件如下所示:
{
"ECMadrid": "tbd",
"ECParis": "tbd2"
}
我用来读取文件的函数如下所示:
getReferenceNumber(productName){
fs.readFile('./filepath.json', 'utf-8', (err, jsonString) => {
if (err) {
console.log(err)
} else {
try {
const data = JSON.parse(jsonString);
console.log("The reference number before returning is: ", data[productName]);
return data[productName];
} catch (err) {
console.log("Error parsing JSON:", err);
}
}
});
}
我在测试文件中调用该函数,如下所示:
let referenceNumber = await jsonHelper.getReferenceNumber("ECMadrid");
await console.log("I got sent: ", referenceNumber);
我希望这两个控制台日志输出相同的结果,但我的输出是这样的(值得注意的是,它首先输出函数调用之后的控制台日志,我认为这很奇怪并且值得指出):
我收到了:未定义
返回前的参考编号是:tbd
我试图弄清楚为什么 getReferenceNumber 函数正确地将我想要的内容分配给 data[productName] ,但将 undefined 返回到我实际调用它的类。预先感谢您的任何反馈
getReferenceNumber
不是 async
,并且不返回承诺。唯一的 return
语句位于嵌套函数中,该函数从该函数返回,而 not 来自 getReferenceNumber
。这意味着 getReferenceNumber
不返回任何值,这就是为什么你得到“未定义”。
fsPromises.readFile
。
我相信这是等价的。
async getReferenceNumber(productName: string) {
try {
const jsonString = await fs.promises.readFile('./filepath.json', 'utf-8')
try {
const data = JSON.parse(jsonString);
console.log("The reference number before returning is: ", data[productName]);
return data[productName];
}
catch (err) {
console.log("Error parsing JSON:", err);
}
} catch (err) {
console.log(err);
}
}
您可以将
readFile
替换为 readFileSync
以使用同步调用(如果您同意它是阻塞代码)。await
。