1. 程式人生 > >在做socket有關的H5時,遇到同時投票排名頁會出現混亂的情況

在做socket有關的H5時,遇到同時投票排名頁會出現混亂的情況

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)