以下兩個方法,區別只在有沒有catch,使用的時候卻要注意
// 封裝請求方法,同步loading狀態出去
export const fetchWithLoading = async (fn: Function, params: any, loading: Ref) => {loading.value = true;try {return await fn(params);} finally {loading.value = false;}
};// 封裝請求方法,同步loading狀態出去
export const fetchWithLoading2 = async (fn: Function, params: any, loading: Ref) => {loading.value = true;try {return await fn(params);} catch (err) {ElMessage({type: 'error',message: 'fetchWithLoading請求失敗',});} finally {loading.value = false;}
};
調用
ctx.tableData = await fetchWithLoading(SqlQueryApi.queryData, { }, loading)console.log(ctx.tableData[0]); // 使用fetchWithLoading時,fetchWithLoading內報錯后不會執行這里的代碼,程序正常ctx.tableData = await fetchWithLoading2(SqlQueryApi.queryData, { }, loading)console.log(ctx.tableData[0]); // 使用fetchWithLoading2時,fetchWithLoading內報錯后ctx.tableData為空,執行這段代碼會導致js報錯
調用await fetchWithLoading(),如果內部報錯,則不會繼續執行下面的代碼console.log
調用await fetchWithLoading2(),如果內部報錯,則會繼續執行console.log,導致出現運行時錯誤
敲黑板
await是做異步轉同步,我們默認應該認為await 內部如果報錯,代碼會中斷,不會繼續執行
所以不應該寫出例子中的 fetchWithLoading2() 這樣的異步方法給外部使用
如果調用了接口,還捕獲了異常,就要對返回結果進行空處理
最近實踐是
編寫異步方法要處理數據異常,數據異常時不要返回
調用異步方法不用處理捕獲異常