更改函数中jQuery内的Javascript异步函数返回undefined
如何在jQuery .change函数中调用异步函数? 我尝试了以下内容,它让我“未定义”……
async function getData(){ try { return await $.getJSON('./data.json').promise(); } catch(error) { console.log("error" + error); throw error; } finally { alert("done"); } }
这是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"] } } } }
这是jQuery函数:
$('select[name="make"]').change(function(){ // THIS LET RETURNS EITHER First or Second let makeSelected = $('select[name="make"] option:selected').val(); getData().then(data => { let topModels = data.stuff; // THIS RETURNS UNDEFINED console.log(topModels.makeSelected); // THIS RETURNS THE CORRECT DATA console.log(topModels.First); }); });
为什么let变量不能用于第一个console.log?
一切都应该工作正常,但你正在访问“data.stuff”中不存在的属性(“makeSelected”)。 通过使用data.stuff.makeSelected
,这就是你要求的。 现在,如果您打算查找名称等于变量“makeSelected”内的值的属性,则有2个主要路径可供选择:
1)使用“eval”:你可以构建一个字符串,就像let str = "data.stuff."+makeSelected; let result = eval(str);
let str = "data.stuff."+makeSelected; let result = eval(str);
2)您可以使用[]
表示法来访问JS对象属性,就像let result = data.stuff[makeSelection];
这是我的首选解决方案。