Javascript 如果已经完成了类似的工作,则推迟Node.js HTTP请求
我正在做一项服务,从远程主机检索照片,并在将其传递给客户端之前进行一些处理。它在本地缓存检索到的源照片,以避免以后再次检索 但是,如果有多个快速连续的请求,则源图像将尚未在本地保存,并且会执行不必要的检索 如果源映像当前已被检索,那么在缓存源映像之前延迟传入请求的好方法是什么Javascript 如果已经完成了类似的工作,则推迟Node.js HTTP请求,javascript,node.js,http,Javascript,Node.js,Http,我正在做一项服务,从远程主机检索照片,并在将其传递给客户端之前进行一些处理。它在本地缓存检索到的源照片,以避免以后再次检索 但是,如果有多个快速连续的请求,则源图像将尚未在本地保存,并且会执行不必要的检索 如果源映像当前已被检索,那么在缓存源映像之前延迟传入请求的好方法是什么 我目前一直在使用Node.js流,从入站请求流开始,通过缓存和转换逻辑将其传递到出站流。您可以缓存承诺,因此对同一资源的所有传入请求只需要一次传输,避免数据库或某些API被淹没 const Cache = {}; fun
我目前一直在使用Node.js流,从入站请求流开始,通过缓存和转换逻辑将其传递到出站流。您可以缓存承诺,因此对同一资源的所有传入请求只需要一次传输,避免数据库或某些API被淹没
const Cache = {};
function getPhoto(photoId) {
let cacheKey = `photo-${photoId}`;
let photoCache = Cache[cacheKey];
if (photoCache instanceof Promise)
return photoCache; //Return the promise from the cache
let promise = new Promise((resolve, reject) => {
if (photoCache) //Return the photo if exists in cache.
return resolve(photoCache);
return processPhoto(photoId).then(response => {
//Override the promise with the actual response
Cache[cacheKey] = response;
resolve(response);
}).catch(err => {
Cache[cacheKey] = null; //We don't want the rejected promise in cache!
reject();
});
});
if (!photoCache)
Cache[cacheKey] = promise; //Save the promise
return promise;
}
function processPhoto(photoId){
return new Promise((resolve, reject) => {
// Get the image from somewhere...
// Process it or whatever you need
//...
resolve('someResponse');
});
}
- 对特定照片的第一个请求将执行查找,并将承诺存储在缓存中
- 第二个请求进入,如果第一个请求的照片尚未检索,
将返回相同的承诺,当承诺得到解决时,两个请求将得到相同的响应getPhoto
- 第三个请求出现在照片已经被检索之后,因为照片是缓存的,所以它只会返回响应