我正在编写一个电子应用程序,要求我从文件中读取并使用jQuery将其内容解析为javascript对象,而且我遇到了麻烦。目前myObject(参见代码中)返回null,它应该返回从json文件解析的实时javascript对象。我使用的代码如下,可能值得指出它是在渲染器进程中编写的。我对javascript很陌生,所以很可能是一些我不知道的东西。
loadObjectBtn.addEventListener('click', function loadObject(event){
myObject = jsonParser('C:\\someFolder\\myApp\\myJsonFile.json')
console.log(myObject)
return myObject
})
function jsonParser(fileName){
var jsonObj = null
fs.readFile(fileName, 'utf8', function (err,data){
if(err){
return console.log(err)
}
console.log("read from file successfully")
jsonObj = jQuery.parseJSON(data)
})
return jsonObj
}
有趣的是,如果我在行上运行带有断点的代码:
return jsonObj
在函数jsonParser()
中,代码似乎正常工作并返回myObject
的正确值。你们中的任何一个人都知道为什么会这样,或者对某些替代代码提出建议吗?
感谢阅读!
答案 0 :(得分:0)
fs.readFile
是一个异步函数。这意味着,当您执行jsonParser
并执行return jsonObj;
时,它尚未初始化(当调用fs.readFile
的回调时,这将在以后异步发生)。这就是undefined
您可以修改jsonParser
函数以接受回调,您可以使用该回调在已解析的数据完成主函数后将其传回。
样品:
loadObjectBtn.addEventListener('click', function loadObject(event){
jsonParser('C:\\someFolder\\myApp\\myJsonFile.json',function(err, data){
//Check for error
if(err){
// Handle error
return;
}
// Data is available here
console.log(data)
})
})
function jsonParser(fileName, cb){
cb = (cb && typeof cb === 'function' && cb) || function(){};
fs.readFile(fileName, 'utf8', function (err,data){
if(err){
// Error happened, call the cb function with the error as first argument
cb(err)
}
//It worked, parse and hand the data back to the callback
var jsonObj = jQuery.parseJSON(data)
cb(null,jsonObj);
})
}
Handy link on understanding error first callbacks
编辑: 在评论中添加@Archer共享的链接 Asynchronous vs synchronous execution, what does it really mean?
另一种选择(尽管通常不鼓励)是to use the synchronous version fs.readFileSync
答案 1 :(得分:0)
这是因为fs.readFile
是异步的,在数据可用之前需要一些时间。这就是为什么我们将回调函数传递给所有异步调用。这是一个小的重写:
loadObjectBtn.addEventListener('click', function loadObject(event){
jsonParser('C:\\someFolder\\myApp\\myJsonFile.json', printJSON)
})
function printJSON (jsonData) {
console.log("read from file successfully");
jsonObj = jQuery.parseJSON(jsonData);
console.log(jsonObj);
}
function jsonParser(fileName, callback){
var jsonObj = null;
fs.readFile(fileName, 'utf8', function (err,data){
if(err){
return console.log(err)
}
return callback(data)
})
}