Угловое чтение значения функции js как неопределенного, даже если объект имеет значение - PullRequest
0 голосов
/ 19 мая 2019

Я создал несколько функций javascript, которые читают и записывают в файл json, предполагается, что он вызывается в угловом формате (из кода машинописи) с использованием библиотеки jsonfile. Вот код:

function savePatient(patient){
    const jsonfile = require('jsonfile')
    const file = 'src/resources/patients.json'
    jsonfile.writeFile(file, patient, {flag: 'a'}, function(err){
        if(err) console.error(err)
    })
}

function getPatients(){
    const jsonfile = require('jsonfile')
    const file = 'src/resources/patients.json'
    jsonfile.readFile(file, function(err, obj){
        if(err) console.error(err)
        console.dir(obj)
        return obj
    })
}

Вот объявление функций в угловом компоненте:

declare function savePatient(patient: Patient);
declare function getPatients(): Patient[];

Мне удалось успешно вызвать функцию savePatient(), и она делает, как задумано.

Когда я пытаюсь вызвать console.log(getPatients()) из компонента Angular, вывод не определен, но сама функция getPatients() генерирует правильный вывод консоли из строки console.dir(obj).

Как мне получить правильное значение функции внутри углового компонента?

Кроме того, этот проект находится внутри электронного контейнера, если кто-то сочтет это уместным.

Мне показалось интересным, что компонент Angular является первым, который выводит информацию на консоль, хотя было бы разумно, чтобы функции js выдавали перед ним вывод, учитывая, что компонент Angular должен зависеть от возвращаемого значения функция js, но я не знаю, что с этим делать.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Ваша функция

function getPatients(){
    const jsonfile = require('jsonfile')
    const file = 'src/resources/patients.json'
    jsonfile.readFile(file, function(err, obj){
        if(err) console.error(err)
        console.dir(obj)
        return obj
    })
}

работает асинхронно (см. документы ).

У вас есть два варианта. Первый - это асинхронная обработка чтения файла:

function getPatients(){
    const jsonfile = require('jsonfile')
    const file = 'src/resources/patients.json';
    // Create a new promise
    return new Promise((resolve, reject) => {
        jsonfile.readFile(file, function(err, obj){
            if(err){
                console.error(err)
                return reject(err);
            }
            console.dir(obj)
            return resolve(obj);
        });
    });
}

...

// Prints the read object in the console, after the file reading is done
getPatients().then((obj) => {
    console.dir(obj);
});

Второй вариант, и, на мой взгляд, лучшее решение для вас - использовать синхронный способ чтения файла:

function getPatients(){
    const jsonfile = require('jsonfile')
    const file = 'src/resources/patients.json'
    try {
        const obj = jsonfile.readFileSync(file);
        console.dir(obj);
        return obj;
    } catch(e) {
        console.error(e);
    });
}
0 голосов
/ 20 мая 2019

Пожалуйста, убедитесь, что ваша функция что-то возвращает. В этом фрагменте я добавил оператор возврата перед jsonfile.readfile ().

function getPatients(){
  const jsonfile = require('jsonfile')
  const file = 'src/resources/patients.json'
  return jsonfile.readFile(file, function(err, obj){
      if(err) return err;
      return obj;
  });
}
...