【问题标题】:Refresh Datas after each second in js (async functions)js中每秒刷新数据(异步函数)
【发布时间】:2021-03-10 12:54:10
【问题描述】:

在下面的代码中,您可以看到异步函数,第一个用于获取一些数据,第二个是使用刚刚获取的数据构建一个图表。它工作得很好,但我想每秒刷新一次数据。我到处都放了 setInterval 但没有任何效果......

代码如下:

chartSet();

const xAxis = [];
const yAxis = [];

async function resetChart() {
  const datas = await fetch(
    "https://canvasjs.com/services/data/datapoints.php"
  );
  const datasJson = await datas.json();
  datasJson.forEach((elt) => {
    xAxis.push(elt[0]);
    yAxis.push(elt[1]);
  });
}

async function chartSet() {
  await resetChart().catch(() => {
    console.warn("Didn't work");
  });
  const ctx = document.getElementById("myChart3").getContext("2d");
  const myChart = new Chart(ctx, {
    type: "line",
    data: {
      labels: xAxis,
      datasets: [
        {
          label: "Random datas",
          data: yAxis,
          backgroundColor: "rgba(255, 99, 132, 0.2)",
          borderColor: "rgba(255, 99, 132, 1)",
          borderWidth: 1,
        },
      ],
    },
    options: {
      scales: {
        yAxes: [
          {
            ticks: {
              beginAtZero: true,
            },
          },
        ],
      },
    },
  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js" integrity="sha512-d9xgZrVZpmmQlfonhQUvTR7lMPtO7NkZMkA0ABN3PHCbKA5nqylQ/yWlFAyY6hYgdF1Qh6nYiuADWwKB4C2WSw==" crossorigin="anonymous"></script>
<canvas id="myChart3"></canvas>

感谢您的帮助!

【问题讨论】:

    标签: javascript fetch settimeout setinterval


    【解决方案1】:

    你的 js 有一些问题。试试这个:

    setInterval(resetChart, 1000)
    
    const xAxis = [];
    const yAxis = [];
    
    async function resetChart() {
      fetch("https://canvasjs.com/services/data/datapoints.php")
        .then(data => data.json(), error => console.warn("Didn't work"))
        .then(dataList => {
          dataList.forEach(elt => {
            xAxis.push(elt[0]);
            yAxis.push(elt[1]);
            chartSet()
          })
        })
    }
    
    
    
    
    async function chartSet() {
      const ctx = document.getElementById("myChart3").getContext("2d");
      const myChart = new Chart(ctx, {
        type: "line",
        data: {
          labels: xAxis,
          datasets: [{
            label: "Random datas",
            data: yAxis,
            backgroundColor: "rgba(255, 99, 132, 0.2)",
            borderColor: "rgba(255, 99, 132, 1)",
            borderWidth: 1,
          }, ],
        },
        options: {
          animation: {
            duration: 0
          },
          scales: {
            yAxes: [{
              ticks: {
                beginAtZero: true,
              },
            }, ],
          },
        },
      });
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js" integrity="sha512-d9xgZrVZpmmQlfonhQUvTR7lMPtO7NkZMkA0ABN3PHCbKA5nqylQ/yWlFAyY6hYgdF1Qh6nYiuADWwKB4C2WSw==" crossorigin="anonymous"></script>
    <canvas id="myChart3" style="pointer-events:none"></canvas>

    请注意,我必须禁用画布上的指针事件,因为 Chart.js jquery 本身中出现了某种跳过错误。我还禁用了图表动画,因为第一次之后它看起来有点烦人。

    【讨论】:

    • 感谢您的回答!但是,当我尝试您的两个代码时,结果是相同的,它每秒刷新一次图表,但数据仍然相同。感觉只是刷新了界面,没有刷新自己的数据。
    【解决方案2】:

    工作代码:

    chartSet();
    
    let xAxis = [];
    let yAxis = [];
    
    let timeout = null;
    
    async function resetChart() {
      const datas = await fetch(
        "https://canvasjs.com/services/data/datapoints.php?" + Math.random()
      );
      const datasJson = await datas.json();
      xAxis = [];
      yAxis = [];
      datasJson.forEach((elt) => {
        xAxis.push(elt[0]);
        yAxis.push(elt[1]);
      });
      clearTimeout(timeout);
      timeout = setTimeout(() => {
        chartSet();
      }, 1000);
    }
    
    async function chartSet() {
      await resetChart().catch(() => {
        console.warn("Didn't work");
      });
      const ctx = document.getElementById("myChart3").getContext("2d");
      const myChart = new Chart(ctx, {
        type: "line",
        data: {
          labels: xAxis,
          datasets: [{
            label: "Random datas",
            data: yAxis,
            backgroundColor: "rgba(255, 99, 132, 0.2)",
            borderColor: "rgba(255, 99, 132, 1)",
            borderWidth: 1,
          }, ],
        },
        options: {
          scales: {
            yAxes: [{
              ticks: {
                beginAtZero: true,
              },
            }, ],
          },
        },
      });
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js" integrity="sha512-d9xgZrVZpmmQlfonhQUvTR7lMPtO7NkZMkA0ABN3PHCbKA5nqylQ/yWlFAyY6hYgdF1Qh6nYiuADWwKB4C2WSw==" crossorigin="anonymous"></script>
    <canvas id="myChart3"></canvas>

    【讨论】:

    • 感谢您的回答!但是,当我尝试您的两个代码时,结果是相同的,它每秒刷新一次图表,但数据仍然相同。感觉只是刷新了界面,没有刷新自己的数据。
    • @Simon 我认为您应该在每次获取数据后重置 2 轴。我编辑了我的答案。
    • 另外,我在每个请求上发送一个随机 id 以返回不同的数据(禁用缓存)
    • 非常感谢,现在一切正常!
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多