
個人主頁楊利杰YJlio??個人專欄《Windows 疑難雜癥與工單復盤案例庫》 《Sysinternals實戰(zhàn)教程》《WINDOWS教程》 《Windows PowerShell 實戰(zhàn)》 《IOS插件分析測試》《超簡單用Python讓Excel飛起來》讓復雜的事情更簡單讓重復的工作自動化HarmonyOS 7.0學習筆記60異步任務取消與重復提交防護文章目錄HarmonyOS 7.0學習筆記60異步任務取消與重復提交防護一、先給任務狀態(tài)劃清邊界二、重復提交要在入口處攔住三、取消動作不一定等于任務已經(jīng)停止四、讓只有當前任務更新頁面五、區(qū)分當前請求和過期響應六、重試應由明確規(guī)則觸發(fā)七、用場景矩陣覆蓋邊界八、這篇練習的檢查清單參考資料大家好我是楊利杰 YJlio。異步操作開始后界面要面對幾個很實際的問題用戶連續(xù)點了幾次、任務進行中想取消、舊請求晚于新請求返回以及失敗后是否允許重試。如果這些邊界沒有提前約定頁面可能出現(xiàn)重復任務、舊結(jié)果覆蓋新結(jié)果或“看起來取消了但仍在更新”的情況。這篇我把關注點放在請求中狀態(tài)、重復操作攔截和結(jié)果收斂上。原稿沒有提供具體異步 API、取消接口或運行記錄因此本文以狀態(tài)設計和驗證方法為主不將示意圖寫成已經(jīng)實現(xiàn)的功能。一、先給任務狀態(tài)劃清邊界我會先把一次操作抽象為幾種互斥狀態(tài)尚未開始、正在執(zhí)行、成功、失敗、已取消。成功、失敗和取消是不同的結(jié)束原因頁面提示和后續(xù)行為也不應混成一個“完成”。在開始實現(xiàn)前可以先回答任務運行時觸發(fā)按鈕顯示什么狀態(tài)取消動作是中止底層操作還是只讓當前頁面不再接收它的結(jié)果失敗后用戶能否主動重試任務成功后重復操作是否仍然允許這些選擇要跟業(yè)務目的對應。對讀取類請求和會產(chǎn)生副作用的提交操作重復執(zhí)行帶來的影響并不一樣。二、重復提交要在入口處攔住最直觀的防護是在任務進行期間阻止同一入口再次啟動例如暫時禁用觸發(fā)控件或在調(diào)用邊界檢查是否已有任務。具體采用哪種方式應由項目現(xiàn)有狀態(tài)管理和異步實現(xiàn)決定。這里要區(qū)分界面防抖和業(yè)務冪等。按鈕禁用可以減少用戶重復操作但網(wǎng)絡重試、頁面重建或客戶端重發(fā)仍可能造成服務端重復處理。若一次操作有寫入、扣費或創(chuàng)建記錄等副作用還需要服務端或業(yè)務層的冪等設計僅靠界面狀態(tài)不能保證請求只執(zhí)行一次。三、取消動作不一定等于任務已經(jīng)停止“用戶點了取消”首先表示界面收到了取消意圖但底層操作是否真的停止要看具體 API 和服務能力。有些調(diào)用支持中止有些調(diào)用無法撤回只能讓頁面忽略遲到的結(jié)果。因此我會分別核驗兩件事執(zhí)行層當前工程使用的異步調(diào)用是否支持真正取消取消后底層任務是否停止展示層即使底層不能中止舊結(jié)果是否會被頁面識別為過期并丟棄未經(jīng)接口文檔和運行觀察不能把第二種“忽略結(jié)果”說成第一種“取消了網(wǎng)絡請求”。這兩個詞對應的行為不同。四、讓只有當前任務更新頁面多個操作可能先后開始、按相反順序返回。為避免舊結(jié)果覆蓋新狀態(tài)結(jié)果更新時需要確認它仍屬于當前有效任務。實現(xiàn)上可以依據(jù)工程支持的任務標識或狀態(tài)機制來判斷本文不指定未經(jīng)核驗的 ArkTS API。如果結(jié)果已經(jīng)過期就不應繼續(xù)改寫當前輸入對應的頁面狀態(tài)。與此同時結(jié)束清理也要謹慎前一個任務結(jié)束時不能誤把后一個仍在運行的任務標成空閑。任務歸屬檢查和加載狀態(tài)清理應該圍繞同一個“當前任務”規(guī)則設計。五、區(qū)分當前請求和過期響應排查異步問題時我會為每次操作記錄足以區(qū)分先后的信息例如本地任務序號、觸發(fā)時間或輸入摘要是否記錄原文要服從隱私規(guī)則。重點不是采用某一種標識方案而是讓日志能回答“這條結(jié)果對應哪次操作”。適合在練習記錄中核對的時間線包括先啟動任務 A再啟動任務 BB 先返回A 后返回。此時需要觀察最終頁面是否仍呈現(xiàn) B 的當前結(jié)果。若只有單次請求測試很難發(fā)現(xiàn)順序變化帶來的覆蓋問題。六、重試應由明確規(guī)則觸發(fā)失敗后是否重試取決于失敗原因、業(yè)務副作用和服務端約定。用戶主動重試、應用自動重試、用戶取消后再次發(fā)起是不同操作不能把它們都當成一次重復點擊。我會先確認失敗是否可能已經(jīng)在服務端產(chǎn)生結(jié)果重試會不會重復創(chuàng)建或計費取消后是否保留輸入再次發(fā)起是否創(chuàng)建新的任務上下文。若這些問題尚未核對就不應該添加自動重試邏輯。七、用場景矩陣覆蓋邊界與其只測試一次成功我更愿意把操作順序?qū)懗尚【仃囍饤l觀察按鈕狀態(tài)、任務數(shù)量和最終展示場景需要觀察的結(jié)果單次觸發(fā)是否進入處理中最終狀態(tài)是否符合實際返回快速連續(xù)點擊是否被入口攔截是否意外啟動多個任務成功后再次提交是否按業(yè)務要求允許新任務失敗后重試是否由明確動作觸發(fā)是否產(chǎn)生重復副作用運行中取消底層操作是否真正停止頁面是否停止接受結(jié)果舊任務遲到是否覆蓋了新任務的狀態(tài)或結(jié)果離開頁面再返回頁面狀態(tài)和任務生命周期是否符合預期測試時我會保留完整操作順序和環(huán)境信息。如果實際工程沒有對應的取消能力或運行日志就把未驗證項明確列出而不是根據(jù)界面按鈕推測底層行為。八、這篇練習的檢查清單準備在工程中實現(xiàn)時我會檢查任務狀態(tài)是否互斥且有明確轉(zhuǎn)換條件運行中的重復操作是否在正確邊界被攔截取消語義是否與底層 API 能力一致遲到結(jié)果和過期任務是否不能覆蓋當前頁面失敗重試是否由業(yè)務規(guī)則允許并考慮重復副作用關鍵路徑是否在目標 SDK/API 與設備上實際核驗。原稿中的describeResult示例只負責本地字符串判斷和展示不包含異步任務、取消或防重復邏輯functiondescribeResult(input:string):string{returninput.trim().length0?暫無內(nèi)容:已讀取${input}}// 在頁面事件中調(diào)用并顯示返回結(jié)果觀察輸入與頁面輸出是否一致。這篇內(nèi)容說明的是需要實現(xiàn)和測試的邊界不能據(jù)此聲稱項目已經(jīng)具備這些保護。參考資料《HarmonyOS 7.0學習筆記異步任務取消與重復提交防護》原始學習筆記。原稿代碼僅為本地字符串展示示例。HarmonyOS 官方開發(fā)文檔華為開發(fā)者聯(lián)盟文檔中心。取消能力、異步 API 和狀態(tài)管理寫法需按工程當前版本核對。說明本文圖片均為概念示意不是 DevEco Studio、模擬器或真機實測截圖。原稿沒有提供異步取消或重復提交保護的實現(xiàn)與實測記錄發(fā)布前請用實際工程驗證并補充證據(jù)。返回頂部