为什么在调用fetchNotes后变得不确定

时间:2018-08-09 13:44:23

标签: javascript node.js command

fetchNotes函数调用addNote后,它向我显示undefined,因为push函数中未定义addNote方法

const fs = require('fs');
    const fetchNotes = ()=>{
      fs.readFile('data.json',(err,notes)=>{
        if(err){
         // return empty array if data.json not found
         return []; 
        }else{
         // return Object from data found data.json file
          return JSON.parse(notes)
        }
    });
    }


const saveNotes = (notes) =>{
  fs.writeFile('data.json',JSON.stringify(notes),()=>{
   console.log('Notes is successfully saved'); 
  });
}
const addNote = (title, body)=>{
  const note = {
    title,
    body
  }
  const notes = fetchNotes();
  //Push method not defined 
  notes.push(note);
  saveNotes(notes);
  return note;
}
module.exports.addNote = addNote;

2 个答案:

答案 0 :(得分:0)

return JSON.parse(notes)不会将此值存储在fetchNotes内,因为它是异步的,因此您稍后会获取文件的内容。

要异步执行,可以使用async / await:

const fetchNotes = () => {
    return new Promise((resolve, reject) => {
        fs.readFile('data.json', (err,notes) => resolve(JSON.parse(notes)));
    }) 
}

const addNote = async (title, body) => {
  // ...
  const notes = await fetchNotes();
  notes.push(note);
  saveNotes(notes);
  return note;
}

您也可以同步执行此操作:

const fetchNotes = () => JSON.parse( fs.readFileSync('data.json') );

const notes = fetchNotes();

答案 1 :(得分:0)

它返回undefined,因为在回调中返回时,并不是从fetchNotes函数本身返回的。

也许您可以使用readFileSync而不使用回调,或者可以许诺并使用async/await

const fetchNotes = () => {
    return new Promise((res, rej) => {
        fs.readFile('data.json', (err, notes) => {
            if (err) {
                // return empty array if data.json not found
                res([]);
            } else {
                // return Object from data found data.json file
                res(JSON.parse(notes));
            }
        });
    });
}
const addNote = async (title, body) => {
    const note = {
        title,
        body
    }
    const notes = await fetchNotes();
    //Push method not defined 
    notes.push(note);
    saveNotes(notes);
    return note;
}

或者,您可以使用utils.promisify