角度读取js函数的值时未定义,即使对象具有值

时间:2019-05-19 18:51:24

标签: javascript json angular electron

我创建了一些可读写json文件的javascript函数,假设它们使用jsonfile库以angular(来自打字稿代码)调用。 这是代码:

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

这是Angular组件中的函数声明:

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

我设法成功调用了savePatient()函数,并且它按预期执行。

当我尝试从Angular组件内部调用console.log(getPatients())时,输出未定义,但是getPatients()函数本身从console.dir(obj)行生成了正确的控制台输出。

我应该如何在Angular组件中获取正确的函数值?

此外,如果有人发现这个项目相关,那么该项目也将放在电子容器内。

我发现有趣的是Angular组件是第一个向控制台输出信息的组件,尽管考虑到Angular组件应依赖于的返回值,但js函数应该在其之前提供输出是有意义的js函数,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

您的功能

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

以异步方式工作(请参见docs)。

您有两个选择。第一个是异步处理文件读取:

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

答案 1 :(得分:0)

请确保您的函数返回某些内容。在此代码段中,我在jsonfile.readfile()之前添加了return语句。

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