【问题标题】: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。为什么不等待文件读取完成?

【问题讨论】:

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


    【解决方案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。
      【解决方案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);
                 });
      
         }
      

      【讨论】:

      • 这是前两个答案的精确副本,这次缩进很差,没有任何解释性文字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2019-08-07
      相关资源
      最近更新 更多