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
    将返回相同的承诺,当承诺得到解决时,两个请求将得到相同的响应
  • 第三个请求出现在照片已经被检索之后,因为照片是缓存的,所以它只会返回响应

我用这种技术实现了它,它成功了!谢谢@sune我看你是新来的,所以,别忘了接受一个对你有帮助的答案(勾选左上角),它也会给你一些声誉。你没有义务这么做,但这将帮助未来的用户,干杯。