Javascript 高效地循环数千个数组项,并为每个非';t在本地存储中

Javascript 高效地循环数千个数组项,并为每个非';t在本地存储中,javascript,arrays,promise,Javascript,Arrays,Promise,我有一个对象数组。每个对象表示一天,有两个属性-日期和项目。Items是一个对象数组,其中每个对象都有关于某个网站的信息。我想通过使用第三方api来增强每个网站对象,以便使用网站的url获取一些数据 为了更有效地执行此操作,我决定使用本地存储缓存api中的数据。因此,对于我的一个items数组中的每个website对象,我查看该特定网站的api信息是否已被缓存,并使用该信息而不是进行api调用。如果数据没有缓存,我将调用api,然后将数据添加到本地存储中,以备下次使用 我正在努力让我的代码为这个

我有一个对象数组。每个对象表示一天,有两个属性-日期和项目。Items是一个对象数组,其中每个对象都有关于某个网站的信息。我想通过使用第三方api来增强每个网站对象,以便使用网站的url获取一些数据

为了更有效地执行此操作,我决定使用本地存储缓存api中的数据。因此,对于我的一个items数组中的每个website对象,我查看该特定网站的api信息是否已被缓存,并使用该信息而不是进行api调用。如果数据没有缓存,我将调用api,然后将数据添加到本地存储中,以备下次使用

我正在努力让我的代码为这个工作,并寻找一个优雅的解决方案。我目前的代码也遇到了一个问题,第三方api给我一个429错误,因为我在短时间内发出了太多的请求,所以理想情况下,我的解决方案会有一些方法来限制我的请求

处理这种情况的正确方法是什么?是否有任何第三方库可以简化此过程

// I want to pass in array of objects like so:
//
// [
//  { date: '12/31/2019', items: [{...}, {...}, {...}, etc] },
//  { date: '01/01/2020', items: [{...}, {...}, {...}, etc] },
//  { date: '01/02/2020', items: [{...}, {...}, {...}, etc] },
// ]
//
// into the enhanceData function and get back the same array of objects,
// but with each object's individual items enhanced with the 3d party data

const enhancedData = await enhanceData(sortedData); 
以下是我当前处理此问题的代码:


// fetch 3rd party data for the given hostname
const fetchSiteData = (hostname) => {
  axios({
    method: 'get',
    url: 'apiurl.com',
    params: someParams,
    headers: someHeaders,
  })
    .then((response) => {
      // handle response stuff and returns the data
      return { ...someData }
    })
    .catch((e) => console.error('api error', e));
};


// see if the api data for each item has been stored locally, fetch from api if not
const enrichItems = (items) => {
  console.log('ENRICHITEMS items', items);
  const enrichedItems = items.map((item) => new Promise((resolve, reject) => {
    const { hostname } = new URL(item.url);
    chrome.storage.local.get(hostname, (cached) => {
      if (cached[hostname]) {
        console.log('found cached value', { ...cached[hostname] });
        resolve({ ...item, alexa: { ...cached[hostname] } });
      } else {
        console.log('no cached value');
        fetchSiteData(hostname)
          .then((siteData) => {
            console.log('siteData', siteData);
            chrome.storage.local.set({ [hostname]: siteData }, () => {
              if (chrome.runtime.lastError) {
                console.log(chrome.runtime.lastError);
              } else {
                console.log('item stored successfully', { ...siteData });
                resolve({ ...item, alexa: { ...siteData } });
              }
            });
          })
          .catch((e) => reject(e));
      }
    });
  }));
  console.log('enrichedItems', enrichedItems);
  return Promise.all(enrichedItems);
};


// should return once each items array has been enhanced
export const categorizeData = (data) => Promise.all(data.map(async (day) => {
  const enrichedItems = await enrichItems(day.items);
  return {
    ...day,
    item: [...enrichedItems],
  };
}));