我有一个用例,我的http请求正缓存服务器上的中间结果。 如果缓存不存在,则请求通过请求另一个服务器来构建它。
使用AJAX到节点服务器连续触发(循环)这些请求,请求数量可以在50到500之间。
问题: 由于请求是在循环中进行的,并且缓存已经不存在,因此首先几个都尝试构建缓存,有时后续请求会找到半构建的缓存,这会返回错误的结果。
我可以通过民意调查解决这个问题:
(function next(){
if(!wait){
fs.readFile(cacheFile, function(err){
if(err) {
wait = true;
createCache(); // sets wait = false;
} else {
useCache();
}
});
} else {
setTimeout(next,waitTime);
}
})();
我的查询: 请求可以在没有轮询的情况下暂停,并且只在第一个请求完成缓存构建过程后才继续吗?
答案 0 :(得分:2)
是的,它可以与Futures / Promise结合使用。你可以拿这个one。 在范围之外定义var cachePromise,您可以使用以下内容:
if (!cachePromise) {
cachePromise = require('future').create()
buildCache(function() {
cachePromise.fulfill();
});
}
cachePromise.when(next); // this one triggers next route in middleware stack
将路由堆栈中的代码放在产生结果的路由之前,你就可以了。
感谢。