backbone.js JavaScript和HTML -重用fetch()中的数据

yacmzcpb  于 2022-11-10  发布在  Java
关注(0)|答案(2)|浏览(152)

我使用基本的fetch请求从服务器检索JSON文件,如下所示:

function getDailyTranscripts (url) {
  fetch(url)
    .then(validateResponse)
    .then(readResponseAsJSON)
    .then(useDailyResult)
    .catch(logError)
}

这将检索一个主JSON文件,然后我将从该文件中创建变量,以便使用charts.js在单个html页面中填充多个图表
目前,我可以通过运行fetch函数中的useDailyResult()函数中的代码来对单个图表执行此操作。但是,我需要对所有图表分别重复此模式,并使用当前的实现复制大量代码和服务器调用。
下面是我的一个图表的当前useDailyResult函数的示例:

function useDailyResult (result) {

  var labels = Object.keys(getUsersByChannel2(result))
  var data = Object.values(getUsersByChannel2(result))

  var ctx = document.getElementById('chartOops').getContext('2d');
  var chart = new Chart(ctx, {
    type: 'doughnut',
    data: {
      labels: labels,
      datasets: [{
        label: 'Channels',
        data: data
      }]
    },
    options: {
      title: {
        display: true,
        text: 'Users by Channel'
      },
      legend: {
        position: 'bottom'
      },
      scales: {
        gridLines: {
          display: false
        }
      },
      plugins: {
        colorschemes: {
          scheme: chartColorScheme
        }
      }
    }
  });
}

我希望得到的最终结果是从服务器检索JSON文件一次,将其存储在本地(例如使用HTML5的本地存储),然后对本地存储的文件运行我的所有chartjs代码。这样我就可以减少代码和服务器调用的次数。
我不确定最好的方法是什么,因为我知道访问JSON文件的唯一方法是从fetch函数中访问。我也一直在考虑使用Backbone.js,因为这可能是一个有用的库。

bhmjp9jg

bhmjp9jg1#

如果将从服务器获取的数据赋给函数可以访问的变量,则可以重用这些数据。
如果你在你的链中有另一个then分配给一个var,那么你可以在执行另一个提取之前检查那个var。

var remoteData = {}

function getDailyTranscripts (url) {
  // check for existing response data based on url param
  if(remoteData[url]) {
    console.log('using pre-fetched data from memory')
    useDailyResult(remoteData[url])
  }
  else {
    console.log('fetching from server', url)
    fetch(url)
      .then(validateResponse)
      .then(readResponseAsJSON)
      .then(jsonData => {
        // assuming readResponseAsJSON returns what you want
        remoteData[url] = jsonData
        useDailyResult(jsonData)
      })
      .catch(logError)
  }
}

请注意,如果在初始获取仍在工作时再次调用getDailyTranscripts,它将启动另一次获取。因此,如果这对您来说可能是个问题,您可能需要添加一些逻辑来解决这个问题。
最好的方法是:(1)读取远程数据,然后(2)将它传递沿着需要它的任何东西,如果你提前知道的话。

fetch(url)
  .then(validateResponse)
  .then(readResponseAsJSON)
  .then(handleAllYourChartsAtOnce) // this function could also store the json in a var
  .catch(logError)
6mw9ycah

6mw9ycah2#

你可以通过多次调用p.then来告诉一个承诺p在它可用时调用多个处理程序:

let data = fetch(url)
    .then(validateResponse)
    .then(readResponseAsJSON);

Promise.all([
  data.then(useDailyResult),
  data.then(buildAnotherChart)
]).catch(logError);

相关问题