在做socket有關的H5時,遇到同時投票排名頁會出現混亂的情況
阿新 • • 發佈:2018-12-10
setTimeout(function () {
$('.ResultListDiv > ul').empty()
JSON.parse(dataJson.data).map(function (value, index) {
console.log(value, index)
if(index === 0){
$('.ResultListDiv > ul' ).append(
'<li style="border-bottom: 0;">' +
' <div class="ResultListHeadDiv2">' +
' <div class="ResultListHead2">' +
' <img src="' + value.avatarurl + '" class="ResultListPersonalHead2">' +
' </div>' +
' <div class="ResultPersonalNameDiv">( ' + value.count + '票 )</div>' +
' <div class="ResultNum2">買單的就是“<span>' + value.nickname + '</span>”了</div>' +
' </div>' +
'</li>'
)
} else {
$('.ResultListDiv > ul').append(
'<li>' +
' <div class="ResultNumDiv">' + (index + 1) + '</div>' +
' <div class="ResultListHeadDiv">' +
'<!-- <img src="__IMG__/HeadPortraitBG1.png" class="ResultListHeadImgBorder"> -->' +
' <img src="' + value.avatarurl + '" class="ResultListHeadImg">' +
' </div>' +
' <div class="ResultListNameDiv">' + value.nickname + '</div>' +
' <div class="ResultListNumOfVotesDiv">' + value.count + '票</div>' +
'</li>'
)
}
})
}, 500)
如果此時A與B同時投票,投票後返回的兩條socket幾乎同時到達,由於這時候頁面還沒有任何內容,所以empty()方法沒有任何作用,但是兩個內容又都可以渲染,這就造成頁面出現重複渲染的bug
解決方法:
使用JS的陣列和push()以及unshift()方法來模擬佇列,達成先進先出,這樣拿到socket的時候只負責將資料push進陣列,然後設定計時器,每隔一秒從陣列中取出第一個值來進行渲染,就可以解決這個問題了。
setInterval(function () {
if(voteQueue.length === 0){
return false
} else {
var listEle = voteQueue.shift()
$('.ResultListDiv > ul').empty()
JSON.parse(listEle).map(function (value, index) {
console.log(value, index)
if(index === 0){
$('.ResultListDiv > ul').append(
'<li style="border-bottom: 0;">' +
' <div class="ResultListHeadDiv2">' +
' <div class="ResultListHead2">' +
' <img src="' + value.avatarurl + '" class="ResultListPersonalHead2">' +
' </div>' +
' <div class="ResultPersonalNameDiv">( ' + value.count + '票 )</div>' +
' <div class="ResultNum2">買單的就是“<span>' + value.nickname + '</span>”了</div>' +
' </div>' +
'</li>'
)
} else {
$('.ResultListDiv > ul').append(
'<li>' +
' <div class="ResultNumDiv">' + (index + 1) + '</div>' +
' <div class="ResultListHeadDiv">' +
'<!-- <img src="__IMG__/HeadPortraitBG1.png" class="ResultListHeadImgBorder"> -->' +
' <img src="' + value.avatarurl + '" class="ResultListHeadImg">' +
' </div>' +
' <div class="ResultListNameDiv">' + value.nickname + '</div>' +
' <div class="ResultListNumOfVotesDiv">' + value.count + '票</div>' +
'</li>'
)
}
})
}
}, 1000)