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

时间:2017-12-30 17:01:48

标签: javascript json function asynchronous return

如何控制日志 - 或者使用异步函数内部返回的数据做任何事情?

例如: JS文件:

   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"和"第二"并将它们添加到div。与" FirstA"相同和" FirstB"和" SecondA"和" SecondB" ......等等。

现在,我得到 承诺{:undefined}

非常感谢任何帮助。

--------- --------- UPDATE

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

塞尔

1 个答案:

答案 0 :(得分:3)

两个问题:

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

  2. 获取 async函数的分辨率值,您必须await它(或通过{{1}以旧方式使用其承诺等等。)

  3. 对于#1,您可以返回then await的结果:

    getJSON

    对于#2,你需要async function getData() { try { return await $.getJSON('./data.json').promise(); } catch (error) { console.log("error" + error); } finally { console.log('done'); } } 你的函数(反过来,这需要在await函数内):

    async

    ...或通过console.log(await getData()); 消费其承诺:

    then

    附注:您的getData().then(data => { console.log(data); }); 隐藏了错误,将其转换为值为getData的分辨率,这通常不是一个好主意。相反,请确保它传播错误:

    undefined

    然后,自然地,确保使用catch (error) { console.log("error" + error); throw error; } 处理或传播错误的任何内容,确保某处处理它的某些内容(否则,您会收到“未处理的拒绝”错误)。

    重新发表评论

      

    如何从函数外的日志中访问json文件中的“stuff”?

    getData的异步结果/分辨率值是JSON定义的对象(它不再是JSON,它已被解析)。所以你可以使用getData,例如:

    .stuff