等待异步函数导致未定义

Posted

技术标签:

【中文标题】等待异步函数导致未定义【英文标题】:Await for asynchronous function results in undefined 【发布时间】:2018-05-27 02:39:42 【问题描述】:

我在使用 Node.js 进行异步/等待时遇到问题。当我尝试这个时:

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。为什么不等待文件读取完成?

【问题讨论】:

【参考方案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】:

你没有从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 需要一个实际的 promise 来等待。这样做是返回一个使用 await 的承诺。因此,我们一直等到调用resolve——这发生在我们加载完 JSON 之后:

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

我们在这里调用readJSONFile。这将返回一个承诺,该承诺会在 JSON 文件加载完成时解析,并允许看似同步执行异步代码。

【讨论】:

是的,现在它就像做梦一样谢谢,但我听说我可以在不使用 Promise 的情况下使用 async/await。这是真的吗? @OFSTTP 等待期待一个承诺。 Async/await 只是 Promise 的语法糖。一旦你把它归结起来,async/await 只是承诺——你不能只是同步执行异步代码。在某种程度上,你总是需要使用 Promise,并且 async/await 函数最终会变成更多的 Promise。 @OFSTTP 请参阅:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…【参考方案3】:

试试看:

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

   

【讨论】:

这是前两个答案的精确副本,这次缩进很差,没有任何解释性文字。

以上是关于等待异步函数导致未定义的主要内容,如果未能解决你的问题,请参考以下文章

等待将undefined返回到异步函数(var all_courses未定义)

异步函数总是返回未定义

带有请求承诺的异步/等待返回未定义

使用类/异步等待时获取未定义的“this”[重复]

Observable 的异步行为导致变量未定义

为啥这个异步函数返回未定义? [复制]