由於歷史原因,前端的一次操作需要調用多個後臺接口,以前寫的一般都是調用一個的,或者哪怕是多個,接口之間也不會有依賴。但最近做的需求裏,前端一次操作需要調用兩個後臺接口,且這兩個接口是有關聯的,需要先調用接口A,再調用接口B。
一開始直接寫兩個Promise,一個成功後調用另一個,類似於這樣子
fetch(urlA)
.then((res) => {
if (res.ret == 0) {
fetch(urlB)
.then(() => {
///
})
.catch(e) {
}
}
})
.catch(e){
}
一切看上去都這麼美好,直到測試同學發現第二個接口一直調用不了。
才發現自己沒考慮失敗情況,如果接口A調用失敗了,接口B是不會調用的。那麼假設用戶第一次操作,調用接口A成功,但後臺因爲某些原因B接口臨時掛了,或者因爲網絡問題B接口調用失敗了。用戶第二次操作時,接口A因爲保護機制,之前已經調用過一次了,這次錯誤碼會返回非0,這樣就調用不到接口B了。而且不管用戶怎麼重試,都調用不到。
與後臺協商後,決定採用接口A結果返回非零也去嘗試調用接口B,因爲前端可能因爲重啓app、網頁、小程序,無法確保是否調用過接口A,所以用戶的操作流程是調用接口A,不管接口A是否返回成功,都去調用接口B,後臺對接口B的調用進行判定,會判斷接口A是否已經調用,未調用則不處理。
事後回想,其實這應該是常識:
- 接口調用可能失敗,一定要考慮失敗的情況
- 一次操作調用多個關聯的接口,要考慮若干接口可能調用失敗的所有情況
- 前端要做到無狀態,當接口調用失敗後,要能夠恢復,確保下次能發起請求,能正常調用接口
在前端方面,踩的坑還不夠多,導致這種常識現在才知道……