,加載狀態(tài)為什么不是加一個(gè) loading 就夠)
“l(fā)oading 加了嗎?加了。”這是交接任務(wù)時(shí)最常聽(tīng)到的一句答復(fù)。但列表頁(yè)的“加載中”從來(lái)不是一件事。首次進(jìn)入頁(yè)面要等首屏數(shù)據(jù),翻頁(yè)和查詢要等表格數(shù)據(jù),點(diǎn)保存要等提交結(jié)果。這三個(gè)“忙”發(fā)生在不同時(shí)刻,持續(xù)不同時(shí)間,也由不同動(dòng)作結(jié)束。如果它們共用一個(gè)布爾值,麻煩就從這個(gè)共享點(diǎn)開始。一個(gè) loading 值,其實(shí)背了三種不同的等待頁(yè)面級(jí)的等待,起點(diǎn)是頁(yè)面掛載,終點(diǎn)是首屏數(shù)據(jù)就緒。它要擋住的是整頁(yè)空白,遮罩一關(guān),頁(yè)面就完整了。表格的等待,起點(diǎn)是某次查詢、翻頁(yè)或刷新,終點(diǎn)是這一批數(shù)據(jù)返回。它只關(guān)心表格區(qū)域,頁(yè)面其它部分早就能用。按鈕的等待,起點(diǎn)是用戶點(diǎn)擊,終點(diǎn)是這次提交的響應(yīng)。它最擔(dān)心的不是頁(yè)面空不空,而是用戶手快連點(diǎn)兩次。三個(gè)等待的生命周期各不相同。共用loading時(shí),任意一個(gè)請(qǐng)求結(jié)束都會(huì)把遮罩關(guān)掉,另外兩個(gè)還在等的請(qǐng)求就失去了提示,或者更糟——它們自己也被順手判成了“已完成”。第一種錯(cuò)位:誰(shuí)先回來(lái)誰(shuí)關(guān)燈兩個(gè)列表請(qǐng)求并發(fā)時(shí),遮罩只開了一次,卻可能被第一個(gè)返回的請(qǐng)求提前關(guān)閉。假設(shè)進(jìn)入頁(yè)面觸發(fā)首屏查詢,用戶又立刻點(diǎn)了翻頁(yè)。首屏請(qǐng)求還在飛,翻頁(yè)請(qǐng)求也發(fā)出去了。響應(yīng)攔截器在任意請(qǐng)求 settle 時(shí)統(tǒng)一把loading置 false,那么翻頁(yè)先回來(lái),遮罩就關(guān)了,首屏數(shù)據(jù)其實(shí)還沒(méi)到。當(dāng)前web-skills的請(qǐng)求封裝里,loading、dialogLoading、btnState三個(gè)狀態(tài)在響應(yīng)攔截器里是同時(shí)被關(guān)閉的。這帶來(lái)一個(gè)判斷點(diǎn):當(dāng)兩個(gè)請(qǐng)求共享同一個(gè)全局 loading 時(shí),先返回的請(qǐng)求會(huì)替后返回的請(qǐng)求關(guān)燈。封裝本身沒(méi)錯(cuò),錯(cuò)在沒(méi)有為“同一時(shí)刻可能有多份等待”留出計(jì)數(shù)或歸屬。第二種錯(cuò)位:舊響應(yīng)關(guān)掉了新請(qǐng)求的提示翻頁(yè)兩次,第一次的請(qǐng)求慢,第二次的快。第二次返回、數(shù)據(jù)已經(jīng)提交到表格,遮罩也關(guān)了;隨后第一次的舊響應(yīng)返回,又把全局 loading 設(shè)回 false。/