更改函数中jQuery内的Javascript异步函数返回undefined

时间:2017-12-30 18:51:57

标签: javascript jquery function asynchronous

如何在jQuery .change函数中调用异步函数?我尝试了以下内容,它返回“undefined”......

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?

1 个答案:

答案 0 :(得分:1)

一切都应该可以正常工作,但是您正在访问“data.stuff”中不存在的属性(“makeSelected”)。使用data.stuff.makeSelected就是你所要求的。现在,如果您打算查找名称等于变量“makeSelected”内的值的属性,则有2条主要路径可供选择:

1)使用“eval”:您可以像let str = "data.stuff."+makeSelected; let result = eval(str);

一样构建字符串

2)您可以使用[]表示法来访问JS对象属性,就像我最喜欢的解决方案let result = data.stuff[makeSelection];一样。