我试图通过将它们保存在mongodb中的简单缓存(键集合)中来限制我的项目中的api获取次数。是Thera的方法,无需使用async / await来阻止.then()在Promise中的传播?
export const getData = (url: string) => {
return new Promise((resolve, reject) => {
findInCache(url)
.then((cached: string | null) => {
if (cached) {
resolve(cached);
}
})
.then(() => {
axios
.get(url)
.then(({data}) => {
setCache(url, data, TTL);
resolve(data);
})
.catch(e => reject(e));
});
});
};
答案 0 :(得分:4)
首先,让我们摆脱Promise构造函数的反模式-在promise executor中的函数调用将返回一个promise,因此,不需要新的Promise
第二,仅在第二个请求为空的情况下才运行第二个请求
export const getData = (url) => findInCache(url)
// here we return haveResult and avoid axios.get(url) altogether
.then((haveResult) => haveResult || axios.get(url)
// sometimes nested .then is useful like in this case
.then(({data}) => {
setCache(url, data, TTL);
return data;
})
);
答案 1 :(得分:0)
当您在then
中返回结果时,该结果将进入下一个then
函数。因此,您可以根据输入参数then
控制下一个inCache
的操作。因此,您可以执行以下操作:
export const getData = (url: string) => {
return new Promise((resolve, reject) => {
findInCache(url)
.then((cached: string | null) => {
if (cached) {
resolve(cached);
return true;
}
return false;
})
.then((inCache) => {
if (!inCache) {
axios
.get(url)
.then(({data}) => {
setCache(url, data, TTL);
resolve(data);
})
.catch(e => reject(e));
}
});
});
};
答案 2 :(得分:0)
您可以执行此操作,而不是链接。如果它在缓存中,则从缓存中获取,否则从网址中获取
export const getData = (url: string) => {
return new Promise((resolve, reject) => {
findInCache(url)
.then((cached: string | null) => {
if (cached) {
resolve(cached);
} else {
axios
.get(url)
.then(({data}) => {
setCache(url, data, TTL);
resolve(data);
})
.catch(e => reject(e));
}
})
});
};