Javascript 高效地循环数千个数组项,并为每个非';t在本地存储中
我有一个对象数组。每个对象表示一天,有两个属性-日期和项目。Items是一个对象数组,其中每个对象都有关于某个网站的信息。我想通过使用第三方api来增强每个网站对象,以便使用网站的url获取一些数据 为了更有效地执行此操作,我决定使用本地存储缓存api中的数据。因此,对于我的一个items数组中的每个website对象,我查看该特定网站的api信息是否已被缓存,并使用该信息而不是进行api调用。如果数据没有缓存,我将调用api,然后将数据添加到本地存储中,以备下次使用 我正在努力让我的代码为这个工作,并寻找一个优雅的解决方案。我目前的代码也遇到了一个问题,第三方api给我一个429错误,因为我在短时间内发出了太多的请求,所以理想情况下,我的解决方案会有一些方法来限制我的请求 处理这种情况的正确方法是什么?是否有任何第三方库可以简化此过程Javascript 高效地循环数千个数组项,并为每个非';t在本地存储中,javascript,arrays,promise,Javascript,Arrays,Promise,我有一个对象数组。每个对象表示一天,有两个属性-日期和项目。Items是一个对象数组,其中每个对象都有关于某个网站的信息。我想通过使用第三方api来增强每个网站对象,以便使用网站的url获取一些数据 为了更有效地执行此操作,我决定使用本地存储缓存api中的数据。因此,对于我的一个items数组中的每个website对象,我查看该特定网站的api信息是否已被缓存,并使用该信息而不是进行api调用。如果数据没有缓存,我将调用api,然后将数据添加到本地存储中,以备下次使用 我正在努力让我的代码为这个
// 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],
};
}));