如何打破承诺链
How to break chain in promise
我试图通过将它们保存在一个简单的缓存中来限制我项目中的 api 提取次数,mongodb 中的密钥集合。是否有一种方法可以在不使用 async/await 的情况下停止 Promise 中的 .then() 传播?
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));
});
});
};
当你 return 产生 then
时,这个结果进入下一个 then
函数。因此,您可以根据输入参数 inCache
来控制接下来 then
的操作。所以你可以这样做:
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));
}
});
});
};
您可以只执行此操作而不是链接。如果它在缓存中,则从缓存中获取,否则从 url
中获取
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));
}
})
});
};
首先,让我们摆脱 Promise 构造函数反模式 - 您在 promise 执行器中调用的函数 returns 是一个 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;
})
);
我试图通过将它们保存在一个简单的缓存中来限制我项目中的 api 提取次数,mongodb 中的密钥集合。是否有一种方法可以在不使用 async/await 的情况下停止 Promise 中的 .then() 传播?
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));
});
});
};
当你 return 产生 then
时,这个结果进入下一个 then
函数。因此,您可以根据输入参数 inCache
来控制接下来 then
的操作。所以你可以这样做:
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));
}
});
});
};
您可以只执行此操作而不是链接。如果它在缓存中,则从缓存中获取,否则从 url
中获取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));
}
})
});
};
首先,让我们摆脱 Promise 构造函数反模式 - 您在 promise 执行器中调用的函数 returns 是一个 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;
})
);