Вы почти приблизились к достижению своей цели, вы в правильном направлении, с композиционной концепцией. может быть, этот код поможет вам осуществить вашу цель.
Давайте смоделируем вашу функцию req следующим образом:
var req = (uri) => {
console.log("inside req", uri);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({ status: 200 });
}, 3000);
});
}
тогда у вас есть версия cacheFunc:
var withCache = (promiseFunc) => {
const cache = {};
return (...args) => {
// suppose first param is uri
var uri = args[0];
return new Promise((resolve, reject) => {
if (cache.hasOwnProperty(uri)) {
return resolve(cache[uri]);
}
promiseFunc(...args).then((data) => {
cache[uri] = data;
resolve(data);
}).catch(reject);
});
}
}
Как видите, вам нужно создать и cache
объект в первой функции, так что это немного похоже на Curring в JS , поэтому вам нужно обернуть ваш запрос (то есть обещание) обернуто в другое обещание из версии кеша, поэтому перед выполнением функции req необходимо проверить, существует ли какой-либо ответ в кеше с тем же ключом uri, если он есть, поэтому немедленно разрешите обещание, иначе выполните функцию req, как только вы получите ответ, кешируйте ответ и разрешите версию обещания кеша.
Так что вы можете использовать его так:
var cacheReq = withCache(req);
cacheReq('https://anywhere.com').then(console.log.bind(null, 'response')).catch(console.log.bind(null, 'error response'));
вы заметите, что в первый раз, когда вы обещаете подождать до 3 секунд, чтобы выполнить запрос, во втором вызове обещание разрешит обещание как можно скорее из-за кеша, если вы попытаетесь с другим URI, он будет ждать 3 секунды снова и будет кешировать ответ, чтобы использовать его в следующий раз.
Надеюсь, это поможет вам.