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

Posted

技术标签:

【中文标题】在同步函数和 for 循环中获取 API【英文标题】:Fetch API in sync functions and for loop 【发布时间】:2019-09-11 03:27:27 【问题描述】:
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 以外的其他东西?

【问题讨论】:

【参考方案1】:

async function - javascript | MDN

异步函数可以包含等待表达式 暂停异步函数的执行并等待 通过了 Promise 的决议,然后恢复异步函数的 执行并返回解析后的值。


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

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

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

【讨论】:

以上是关于在同步函数和 for 循环中获取 API的主要内容,如果未能解决你的问题,请参考以下文章

for 循环在 Angular 中的 Observable 之前完成

javaScript中的同步,异步与回调函数

理解闭包同步异步的最好例子

js执行顺序+同步异步

同步和异步以及回调函数

Node.js 和同步 API 函数