一尘不染

Javascript异步功能控制台记录返回的数据

json

如何管理日志-或对异步函数内部返回的数据进行任何处理?

例如:JS FILE:

   async function getData(){
      try {
         $.getJSON('./data.json', (data) => {
            return data;
         });
      } catch(error) {
         console.log("error" + error);
      } finally {
         console.log('done');
      }
   }

   console.log(getData());

JSON文件:

{
   "stuff": {
      "First": {
         "FirstA": {
            "year": [2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017],
            "Categories": ["Suspension", "Electrical", "Performance", "Motor"]
         },
         "FirstB": {
            "year": [2007, 2008, 2009, 2010, 2011, 2012],
            "Categories": ["Suspension", "Electrical", "Performance", "Motor"]
         }
      },
      "Second": {
         "SecondA": {
            "year": [2002, 2003, 2004, 2005, 2006],
            "Categories": ["Suspension", "Electrical", "Performance", "Motor"]
         },
         "SecondB": {
            "year": [2007, 2008, 2009, 2010, 2011, 2012],
            "Categories": ["Suspension", "Electrical", "Performance", "Motor"]
         }
      }
   }
}

我如何返回/访问JSON文件中的所有信息并使用它。例如,我想使用“ First”和“ Second”并将其添加到div中。与“ FirstA”和“
FirstB”以及“ SecondA”和“ SecondB” …相同。

就目前而言,我得到了 Promise {:undefined}

任何帮助将不胜感激。

---------更新---------

如果我在函数内部运行控制台日志,则可以看到json数据,但是我需要访问函数外部的数据。

哔叽


阅读 154

收藏
2020-07-27

共1个答案

一尘不染

两个问题:

  1. 设置async函数创建的promise的分辨率值,您必须使用函数本身的return语句async。您的代码returngetJSON回调async函数中有一个(将被忽略),而不是函数本身。

  2. 获得功能 的分辨率值async,您必须先使用await它(或以更旧的方式通过then等使用其诺言)。

对于#1,您可以返回awaiting 的结果getJSON

async function getData() {
    try {
        return await $.getJSON('./data.json').promise();
    }
    catch (error) {
        console.log("error" + error);
    }
    finally {
        console.log('done');
    }
}

对于#2,您将需要其中一个await函数(这又需要在async函数内部):

console.log(await getData());

…或通过then以下方式兑现其承诺:

getData().then(data => {
    console.log(data);
});

旁注:您的getData隐藏错误,将其转换为带有值的分辨率,undefined通常不是一个好主意。相反,请确保它传播错误:

catch (error) {
    console.log("error" + error);
    throw error;
}

然后,自然地,请确保使用getData该错误的任何事物都可以处理或传播该错误,并确保某个地方 可以
处理该错误(否则,您将收到“未处理的拒绝”错误)。


重新发表您的评论

我如何从函数外部的日志中访问json文件中的“内容”?

的异步结果/解析度值getData是JSON定义的对象(不再是JSON,它已被解析)。因此,您可以使用.stuff它,例如:

// In an `async` function
console.log((await getData()).stuff);

// Or using `then`:
getData().then(data => {
    console.log(data.stuff);
});
2020-07-27