javascript - 在同步函数和 for 循环中获取 API

标签 javascript asynchronous fetch-api

var lineArr = [];
    var MAX_LENGTH = 10;
    var duration = 500;
    var chart = realTimeLineChart();

function getData() {
  fetch('./getRealTimeData').then((response) => response.json()
.then((data) => {
  return data;
}));
}

function seedData() {
  var now = new Date();
  for (var i = 0; i < MAX_LENGTH; ++i) {
    let data = getData();
    lineArr.push({
      time: new Date(now.getTime() - ((MAX_LENGTH - i) * duration)),
      x: data.x,
      y: data.y,
      z: data.z
    });
  }
}

function updateData() {
  var now = new Date();
  let data = getData();

  var lineData = {
    time: now,
    x: data.x,
    y: data.y,
    z: data.z
  };
  lineArr.push(lineData);

  if (lineArr.length > 30) {
    lineArr.shift();
  }
  d3.select("#chart").datum(lineArr).call(chart);
}

function resize() {
  if (d3.select("#chart svg").empty()) {
    return;
  }
  chart.width(+d3.select("#chart").style("width").replace(/(px)/g, ""));
  d3.select("#chart").call(chart);
}

document.addEventListener("DOMContentLoaded", function() {
  seedData();
  window.setInterval(updateData, 250);
  d3.select("#chart").datum(lineArr).call(chart);
  d3.select(window).on('resize', resize);
});

结果:

rt_st.js:19 Uncaught TypeError: Cannot read property 'x' of undefined
    at seedData (rt_st.js:19)
    at HTMLDocument.<anonymous> (rt_st.js:53)

因为 fetch 是异步的,所以在同步上下文中使用可能会出现很多问题,我不明白如何让 getData() 函数在执行对服务器的请求时等待?或者我可以用什么来代替 fetch?或者我应该使用除 fetch 之外的其他东西?

最佳答案

async function - JavaScript | MDN

An async function can contain an await expression that pauses the execution of the async function and waits for the passed Promise's resolution, and then resumes the async function's execution and returns the resolved value.


async 关键字添加到使用 getData() 的所有函数,并在调用 getData() 时使用 await 关键字:

async function seedData() {
  // ...
  let data = await getData();
  // ...

function updateData() {
  var now = new Date();
  let data = await getData();
  // ...

关于javascript - 在同步函数和 for 循环中获取 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55785890/

相关文章:

javascript - form.reset() 是如何工作的?

javascript - 如何访问返回的 Promise 的值?

c# - IronPython 2.7 可以调用异步 .NET 函数吗?

javascript - 如何在 React 中使用 fetch() API 来设置状态

javascript - 我应该使用什么测试方法?

javascript - 用于添加类宽度的 js 代码不起作用

javascript - 删除名称相同但路径不同的cookie

javascript - 在 node.js 中,如何使用 child_process.exec 以便所有操作都可以异步发生?

javascript - 在 javascript 中使用另一个 fetch 中的 fetch

firebase - 使用 Service Worker 中的 Fetch 处理 Firebase 数据库的身份验证