Javascript 在同步函数和for循环中获取API var lineArr=[]; var MAX_LENGTH=10; var持续时间=500; var chart=realTimeLineChart(); 函数getData(){ fetch('./getRealTimeData')。然后((response)=>response.json() 。然后((数据)=>{ 返回数据; })); } 函数seedData(){ var now=新日期(); 对于(变量i=0;i30){ lineArr.shift(); } d3.选择(“#图表”).datum(lineArr).call(图表); } 函数resize(){ if(d3.select(“#chart svg”).empty()){ 返回; } 图表宽度(+d3.选择(“图表”)。样式(“宽度”)。替换(/(px)/g,”); d3.选择(“图表”)。调用(图表); } document.addEventListener(“DOMContentLoaded”,function()){ 种子数据(); window.setInterval(updateData,250); d3.选择(“#图表”).datum(lineArr).call(图表); d3.选择(窗口)。打开('resize',resize); });

Javascript 在同步函数和for循环中获取API var lineArr=[]; var MAX_LENGTH=10; var持续时间=500; var chart=realTimeLineChart(); 函数getData(){ fetch('./getRealTimeData')。然后((response)=>response.json() 。然后((数据)=>{ 返回数据; })); } 函数seedData(){ var now=新日期(); 对于(变量i=0;i30){ lineArr.shift(); } d3.选择(“#图表”).datum(lineArr).call(图表); } 函数resize(){ if(d3.select(“#chart svg”).empty()){ 返回; } 图表宽度(+d3.选择(“图表”)。样式(“宽度”)。替换(/(px)/g,”); d3.选择(“图表”)。调用(图表); } document.addEventListener(“DOMContentLoaded”,function()){ 种子数据(); window.setInterval(updateData,250); d3.选择(“#图表”).datum(lineArr).call(图表); d3.选择(窗口)。打开('resize',resize); });,javascript,asynchronous,fetch-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

结果:

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未捕获类型错误:无法读取未定义的属性“x”
在seedData(rt_st.js:19)
在HTMLDocument。(rt_st.js:53)
因为fetch是异步的,所以在同步上下文中使用它可能会有很多问题,所以我不明白如何在执行对服务器的请求时让这个getData()函数等待?或者我可以用什么来代替?或者我应该用别的东西,而不是拿东西?

异步函数可以包含等待表达式 暂停异步函数的执行并等待 已通过承诺的解决方案,然后恢复异步函数的 执行并返回已解析的值


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

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)
async function seedData() {
  // ...
  let data = await getData();
  // ...

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