我是一時興起才問的,因為我不相信這可能是時間作業方式的結果,但我想知道是否有人遇到過這樣的解決方案。
是否有可能對不同的 API 端點進行多個異步呼叫,而這些端點又是相互依賴的原子性的?從這個意義上講,如果其中一個呼叫失敗,那么它們都不會執行。
例如,如果我們需要發出兩個API請求,第一個請求是POST一個用戶,第二個請求是使用第一個請求回傳的ID進行POST。然而,如果我無法完成第二個 POST 請求 - 用戶將不會被創建。如果沒有這種依賴性,我將默認使用諸如Promise.all()之類的東西,但是由于我依賴于第一次呼叫的結果,我不認為這將是正確的方法。
uj5u.com熱心網友回復:
是否有可能對不同的API進行多次異步呼叫? 的端點進行多個異步呼叫,而這些端點又是相互依賴的原子性的?在這個意義上,如果 其中一個失敗--它們都不執行?
是的,通過拒絕承諾。
假設您需要依次執行兩個異步操作(一個接著一個)。你可以這樣做:
doA().then(doB)。
如果doA拋出一個錯誤,它就會拒絕該承諾,并且doB不會被呼叫。然后,你可以捕捉錯誤,并以任何你可能需要的方式處理它。通過async函式,你可以做到:
(async function(){
let a = await doA() 。
let b = await doB(a)。
})();
同樣,如果doA拋出一個錯誤,那么doB的呼叫就不會發生。
你可以讓doA和doB拋出不同型別的錯誤來處理它們(如果需要的話,例如......如果B失敗了,在A上做一個回滾)。
class DoAError extends Error { };
class DoBError extends Error { };
async function doA(){
//span>...
//... throw new DoAError();/span>
//...
}
async function doB(){
//span>...
//... throw new DoBError();/span>
//...
}
然后你就這樣處理:
(async function() {
try {
let a = await doA() 。
let b = await doB(a)。
} catch(e){
if(e instanceof DoAError){ /* something wrong with DoA */ } doB(a)
else if(e instanceof DoBError){ /* something wrong with DoB */ }
else { throw e; }
}
})();
uj5u.com熱心網友回復:
你不需要做任何特別的事情來處理這種情況。 試試這個:
- 設定標志,以決定是否有必要對其進行修改。
- 設定標志以確定每個API是否完成,
- 在每個 API 呼叫函式的末尾運行一個
endfunc(), 。
- 只有在每個標志被設定的情況下才繼續執行
endcall()的邏輯。
設定標志...
var api1 = api2 = false;
定義你的API呼叫函式...
apicall1(){
///做api呼叫。
api1 = true;
endfunc()。
}
apicall2() {
//做另一個api呼叫。
api2 = true;
endfunc()。
最后用一個...
來結束這一切。endfunc(){
if(api1 !== true && api2 !== true) {
return;
}
// stuff to execute only after all API calls are done.
}`.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332632.html
標籤:
