Json文件读取功能在电子中神秘地返回null

时间:2018-01-17 10:47:29

标签: javascript jquery input file-io electron

我正在编写一个电子应用程序,要求我从文件中读取并使用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的正确值。你们中的任何一个人都知道为什么会这样,或者对某些替代代码提出建议吗?

感谢阅读!

2 个答案:

答案 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

Related Question on readFile vs 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)
    })
}