如何管理日志-或对异步函数内部返回的数据进行任何处理?
例如: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数据,但是我需要访问函数外部的数据。
哔叽
两个问题:
要 设置async函数创建的promise的分辨率值,您必须使用函数本身的return语句async。您的代码return在getJSON回调async函数中有一个(将被忽略),而不是函数本身。
async
return
getJSON
要 获得功能 的分辨率值async,您必须先使用await它(或以更旧的方式通过then等使用其诺言)。
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通常不是一个好主意。相反,请确保它传播错误:
getData
undefined
catch (error) { console.log("error" + error); throw error; }
然后,自然地,请确保使用getData该错误的任何事物都可以处理或传播该错误,并确保某个地方 可以 处理该错误(否则,您将收到“未处理的拒绝”错误)。
重新发表您的评论
我如何从函数外部的日志中访问json文件中的“内容”?
的异步结果/解析度值getData是JSON定义的对象(不再是JSON,它已被解析)。因此,您可以使用.stuff它,例如:
.stuff
// In an `async` function console.log((await getData()).stuff); // Or using `then`: getData().then(data => { console.log(data.stuff); });