在expressJS中,如何制作一个使多个请求等待同一诺言的缓存

时间:2018-09-20 14:40:08

标签: javascript express promise

我在快递方面有一个终点。

app.get('/',(req,res)=>{

   Promise.all(fetch(url1),fetch(url2))
      .then(i=>res.send(i=))
})

我想创建一个缓存,以避免仅每15秒发出一次请求。假设两次提取都需要5秒钟。

如果我做这样的简单缓存:

    const cache={};

    app.get('/',(req,res)=>{
        if(cache['mykey']==undefined 
           || cache['mykey'].timestamp>new Date().getTime()-15000){
// make or refresh cache;
            Promise.all(fetch(url1),fetch(url2))
                .then(i=>{
                    cache['mykey'].timestamp=new Date().getTime();
                    cache['mykey'].value=i
                    return i;
                })
                .then(i=>res.send(i))
        }else{
            res.send(cache['mykey'].value);
            // or res.status(304).send()
        }
    }

如果在刷新缓存阶段发出2个或更多请求,它将不起作用。如何仅每15分钟刷新一次缓存?

希望我很清楚。

1 个答案:

答案 0 :(得分:1)

这是一个概述,未经测试:

let cache = false

app.get('/', function(req, res) {
    cache = cache || Promise.all([
        fetch('url1'),
        fetch('url2')
    ]).then(results => {
        setTimeout(() => cache = false, 15 * 1000);
        return results;
    });

    const result = cache 

    result.then(([result1, result2]) => {
        res.json({ result1, result2 });
    });
});