分析:再次獲取秒殺結(jié)果,獲取的是消息隊(duì)列處理后的結(jié)果,有可能秒殺成功,有可能秒殺失敗,還有可能是發(fā)送請(qǐng)求了,但是消息隊(duì)列的消息還沒有被消費(fèi),這個(gè)時(shí)候,就需要輪詢的調(diào)用獲取秒殺結(jié)果的函數(shù),我們可以通過window.setInterval方法實(shí)現(xiàn),該方法對(duì)應(yīng)的clearInterval可以終止輪詢,但是需要將setInterval的返回值ID作為參數(shù),所以我們需要定義一個(gè)全局變量接收setInterval的返回值。
1. 在15-seckill-web的模塊的seckill.js中的execSeckill函數(shù)中輪詢調(diào)用再次獲取秒殺結(jié)果的queryResult函數(shù)
//處理響應(yīng)結(jié)果
if(rtnMessage.errorCode == 1){
//秒殺成功,已經(jīng)下單到MQ,返回中間結(jié)果 可以做動(dòng)畫處理
$("#seckillTip").html("<span style='color:red;'>"+ rtnMessage.errorMessage +"</span>");
//接下來再發(fā)送一個(gè)請(qǐng)求獲取最終秒殺的結(jié)果(輪詢,每3秒查一次)
seckillObj.timeFlag = window.setInterval(function(){
seckillObj.func.queryResult(id)
},3*1000);
}else{
//秒殺失敗 展示失敗信息
$("#seckillTip").html("<span style='color:red;'>"+ rtnMessage.errorMessage +"</span>");
}
2. 在15-seckill-web的模塊的seckill.js中編寫queryResult函數(shù)
//查詢最終秒殺結(jié)果
queryResult:function (id) {
$.ajax({
url: seckillObj.url.resultURL() +id,
type:"post",
dataType:"json",
success:function (rtnMessage) {
if(rtnMessage.errorCode == 1){
//秒殺成功
$("#seckillTip").html("<span style='color:blue;'>"+ rtnMessage.errorMessage +"</span>");
//終止輪詢
window.clearInterval(seckillObj.timeFlag);
}else if(rtnMessage.errorCode == 0){
//秒殺失敗
$("#seckillTip").html("<span style='color:blue;'>"+ rtnMessage.errorMessage +"</span>");
//終止輪詢
window.clearInterval(seckillObj.timeFlag);
}else{
//3秒后,依然沒有查詢到結(jié)果,那么需要3秒后,繼續(xù)發(fā)送請(qǐng)求獲取秒殺結(jié)果,我們這里不需要做什么
}
}
});
}
3. 在15-seckill-web的seckill.js的url屬性中定義resultURL
resultURL:function () {
return seckillObj.contextPath +"/seckill/result/";
}
4. 在15-seckill-web的GoodsController中處理獲取最終秒殺結(jié)果的請(qǐng)求
@PostMapping("/seckill/result/{id}")
public @ResponseBody ReturnObject result(@PathVariable("id") Integer id){
ReturnObject returnObject = new ReturnObject();
//在Redis中暫時(shí)沒有查詢到結(jié)果
returnObject.setErrorCode(2);
//用戶再次查詢,肯定處于登錄狀態(tài),可以從session獲取用戶信息(我們這里省略了用戶登錄)
String resultJSON = redisTemplate.opsForValue().get(Constants.REDIS_RESULT + id + ":" + "888888");
return StringUtils.isEmpty(resultJSON)?returnObject : JSONObject.parseObject(resultJSON,ReturnObject.class);
}