【问题标题】:API response is returning undefinedAPI 响应返回未定义
【发布时间】:2017-09-18 16:16:47
【问题描述】:

我正在做一个 API 调用,它返回一个带有一堆对象的数组的 JSON 响应。每个对象都有一个键“dt”,它是一天中特定时间的时间戳,另一个键是“height”,它是当时海洋的预测或过去潮汐高度。

我只想要 AJAX 调用发生的任何时刻当前潮汐的高度。这是我为实现这一目标而创建的函数:

let tideApi = 'https://www.worldtides.info/api?heights&lat=45.202&lon=-123.963&key=24e4ff14-6edf-4f79-9591-e47f9e0e21e1';

$.getJSON(tideApi, function(response) {

  // Create Global variable
  let tideHeight = 0;
  // get current time
  let nowMil = new Date().getTime();
  // round that time to the nearest halfhour and convert back to timestamp (JSON timestamps are set in intervals of 30 minutes)
  let timeNow = Math.round(nowMil/1000/60/30) * 30 * 60 * 1000;

  // set entire array to variable
  let heightArray = response.heights;
  // get length
  len = heightArray.length
  // loop through each object in height array
  for (var i=0; i < len; i++) {
    // if one of the objects timestamp equals current time
    if (i.dt = timeNow) {
      // set tide height to variable
      tideHeight = i.height;
      // return tide height (curretly returning undefined)
      console.log("Tide Height: " + tideHeight);
      return tideHeight;
    } else {
      console.log("Error, no time found");
    }
  }
  // put tide height into div
  $("#tideStat").append("<p>" + tideHeight + "</p>");

});

由于我正在努力弄清楚的原因,它目前返回未定义。任何帮助都会很棒!

API Call(以后不用担心会变)

Codepen

【问题讨论】:

  • if (i.dt = timeNow) 和整数的其他属性???
  • 很抱歉,我不清楚您在问什么。你能更具体一点吗? @Teemu
  • 我应该做到多具体?我指出,您正在尝试读取整数的某些属性,这些属性显然没有定义……作为奖励,您可以看到,您在条件中使用的是赋值运算符而不是相等运算符。
  • 足够具体,我不必问你更清楚什么'???'方法。我只是想更好地了解如何改进我的逻辑。我们都只是想了解我的朋友。我不确定为什么没有定义整数。这有明确的原因吗? @Teemu
  • 已定义,但它是您在上面一行声明的数字,并将0 设置为它。数字显然没有在 AJAX 响应中定义的任何属性。

标签: javascript jquery arrays json ajax


【解决方案1】:

你的代码有一些问题

  1. let timeNow = Math.round(nowMil/1000/60/30) * 30 * 60 * 1000;。您的 API 似乎没有返回毫秒。删除* 1000。
  2. 您没有从您的heightArray 访问项目。相反,只需检查i 上的dt 和height 属性,这是一个整数。所以把i.dt和i.height分别改成heightArray[i].dt和heightArray[i].height。
  3. 当您使用if (lhs = rhs) 时,您尝试分配,而不是比较。因此,在if 条件下将= 更改为===。
  4. 删除return tideHeight;。我想你想要break?不过不确定。由于这一行,您最后的 jQuery 相关代码不会执行。

Forked pen。一些日志被注释掉以获得更好的输出。

【讨论】:

  • 你太棒了,非常感谢。另外感谢您教育我为什么我的代码是错误的以及我犯的错误,所以我没有再犯了。没有愚蠢的问题,即使它有一个明显的答案。每个人都必须从某个地方开始。我不是任何不鼓励人们提问的环境的忠实粉丝,而且最近似乎如此。社区恢复了信心。
【解决方案2】:

使用括号表示法来引用heightArray数组的i对象,===运算符,而不是=,这是赋值运算符

if (heightArray[i].dt === timeNow) {
  // do stuff
  tideHeight = heightArray[i].height;
}

【讨论】:

  • 谢谢。这绝对是一个巨大的帮助。我现在正在点击错误捕获语句,因此我将对此进行一些故障排除。你确实回答了我关于为什么它返回未定义的问题,所以我会接受你作为答案。
  • return tideHeight 的预期结果是什么?
  • 具有与当前时间相同 dt 时间戳的对象的高度属性。
  • 您是否将.then() 链接到$.getJSON() 以获得returned 值?
  • @thatemployee 啊,你期待 for 循环到 break 并可以访问 tideHeight $("#tideStat").append("&lt;p&gt;" + tideHeight + "&lt;/p&gt;");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2017-04-27
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多