Функция чтения файла JSON таинственным образом возвращает ноль, в электронном

Я пишу электронное приложение, которое требует, чтобы я прочитал из файла и проанализировал его содержимое в объект javascript, используя jQuery, и у меня возникли проблемы. В настоящий момент myObject (см. В коде) возвращает ноль, когда он должен возвращать живой объект javascript, проанализированный из файла json. Код, который я использую, приведен ниже, и, возможно, стоит указать, что он написан в процессе рендеринга. Я довольно новичок в 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 ответа

Решение

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);
    }) 
}

Удобная ссылка на понимание ошибки первого колбэка

РЕДАКТИРОВАТЬ: Добавление ссылки, совместно используемой @Archer в комментариях Асинхронный против синхронного выполнения, что это действительно означает?

Альтернативой (хотя обычно не рекомендуется) является использование синхронной версии fs.readFileSync

Связанный вопрос по readFile против readFileSync

Это потому что 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)
    })
}
Другие вопросы по тегам