我有一个用例,我的http请求在服务器上缓存中间结果。如果缓存不存在,则请求通过请求另一个服务器来构建缓存。
这些请求是使用AJAX向Node Server连续(循环)触发的,请求的数量可以在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);
}
})();
我的查询:请求是否可以在不进行轮询的情况下暂停,并且只有在第一个请求完成缓存构建过程后才能继续?
是的,可以与Futures/Promise组合使用。你可以拿这个。在范围之外定义var cachePromise,您可以使用以下内容:
if (!cachePromise) {
cachePromise = require('future').create()
buildCache(function() {
cachePromise.fulfill();
});
}
cachePromise.when(next); // this one triggers next route in middleware stack
将代码放在给出结果的路由之前的路由堆栈中,就可以开始了。
谢谢。