等待异步函数结果未定义

时间:2017-12-13 09:01:50

标签: javascript node.js async-await es6-promise ecmascript-2017

我遇到了与Node的async / await问题。当我尝试这个时:

function Read_Json_File() {
   fs.readFile('import.json','utf-8',(err, data) => {  
       if (err) throw err;
       json_data = JSON.parse(data);

       return json_data;

   });
}

async function run_demo() {
    let get_json_file = await Read_Json_File();
    console.log(get_json_file);
}

run_demo();

它从文件中返回undefined而不是JSON。为什么不等待文件读取完成?

3 个答案:

答案 0 :(得分:3)

你没有从Read_Json_File返回任何东西,因此你得到了未定义的东西 - 你从回调中返回的数据不会产生任何结果。相反,要使用async / await,你需要宣传fs.readFile,因为它还没有。然后你就可以使用async / await:

function readJSONFile() {
  return new Promise((resolve, reject) => {
    fs.readFile('import.json', 'utf-8', (err, data) => { 
      if (err) reject(err);
      resolve(JSON.parse(data));
    });
  });
}

Await要求实际的承诺等待。这样做是返回使用等待的承诺。因此,我们等到我们调用resolve - 当我们加载JSON时会发生这种情况:

let json = await readJSONFile();
console.log(json);

我们在此致电readJSONFile。这将返回一个在JSON文件加载完成时解析的promise,并允许看似同步执行异步代码。

答案 1 :(得分:1)

你错过了承诺解决并拒绝。

使用如下。

function Read_Json_File() {
    return new Promise((resolve,reject)=> {
           fs.readFile('import.json','utf-8',(err, data) => {  
               if (err) reject(err);
               json_data = JSON.parse(data);

               resolve(json_data);

           });
    }
});

答案 2 :(得分:-1)

试一试:

      function Read_Json_File() {
          return new Promise(resolve,reject => {
            fs.readFile('import.json','utf-8',(err, data) => {  
              if (err) reject(err);
                json_data = JSON.parse(data);

              resolve(json_data);
           });

   }