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

rxztt3cl  于 2022-12-24  发布在  Java
关注(0)|答案(2)|浏览(133)

我如何控制日志--或者对从异步函数内部返回的数据做任何事情?
示例: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"和"Second"添加到div中。"FirstA"和"FirstB"以及"SecondA"和"SeconddB"等也是如此。
就目前而言,我得到***承诺{:未定义}***
任何帮助都将不胜感激。

  • -------更新----------
    如果我在函数内部运行控制台日志,那么我就可以看到JSON数据,但是我需要访问函数外部的数据。
    塞尔日
ewm0tg9j

ewm0tg9j1#

两个问题:
1.要设置async函数创建的promise的解析值,必须使用async函数本身的return语句。您的代码在getJSON回调中有return(被忽略),而不是async函数本身。
1.要获取async函数的分辨率值,必须使用await函数(或者使用then等旧方法使用它的承诺)。
对于#1,可以返回awaitgetJSON的结果:

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文件中的“stuff”?
getData的异步结果/分辨率值是JSON定义的对象(它不再是JSON,它已经被解析了),所以你可以在它上面使用.stuff,例如:

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

// Or using `then`:
getData().then(data => {
    console.log(data.stuff);
});
hgqdbh6s

hgqdbh6s2#

我使用下面的方法。创建一个异步函数如下:

private consoleLogAsync = async (message: string, other?: any) => {
    await new Promise((resolve) => setTimeout(resolve, 1000)).then(() => console.info(message, other));
};

在您的异步函数中使用它,您可以在其中记录日志,例如:

await this.consoleLogAsync('myMessage',myObject);

相关问题