我有兩個衛隊,Guard1和Guard2。 Guard1返回一個Observable,Guard2返回布爾值。多個衛兵調用異步功能
canActivate:[GUARD1,GUARD2]
假設GUARD2將返回false,是從GUARD1請求自動取消?或者電話會被執行呢?
我有兩個衛隊,Guard1和Guard2。 Guard1返回一個Observable,Guard2返回布爾值。多個衛兵調用異步功能
canActivate:[GUARD1,GUARD2]
假設GUARD2將返回false,是從GUARD1請求自動取消?或者電話會被執行呢?
Guard1的請求將被取消,Guard2對此負責。我將它與if
聲明進行了比較,在聲明中將條件與&&
結合起來,除了未定義Guards的執行次序/結果(由於一些Guards可能是異步並且有些不是 - 並且您希望它們運行平行,大部分時間)。如果任何條件/ Guard返回false
,則總體結果爲false
,如果其中一個已返回false
,則不需要評估/等待任何其他條件/ Guard,因此正在運行的請求將被取消。
如果你依賴所有的守衛(從守衛發射的請求)執行直到他們全部完成 - 但是這樣做不僅僅是守護路線,還有其他方法可以實際控制這種情況。當我遇到這種情況時,我會更詳細地解釋這一點:
我創建了一個簡單的HTTP緩存,以將請求數保持爲低。我有一個請求只在一個衛隊內被解僱,但是這個請求從未完成,因爲其他衛兵先前返回了錯誤,並且請求被取消了。這個請求從來沒有被緩存,因爲我沒有得到任何結果,因爲請求總是被取消(簡化版本聽起來毫無用處,但它證明了我想說的話)。然後,我這樣做:
這樣的:
const wrapperSubject = new Subject<boolean>();
this.http.get(apiUrl, this.reqOptions)
.map(res => {
// extract data from result ...
// add to cache ...
return booleanGuardResult;
})
.takeUntil(wrapperSubject)
.subscribe(booleanGuardResult=> {
wrapperSubject.next(booleanGuardResult);
wrapperSubject.complete();
});
return = wrapperSubject.asObservable();
這適用於我的情況,請求被緩存。
如果你依賴異步Guard執行的順序,我可以想象創建一個簡單的Guard來完成這個任務,將多個其他的Guard組合成一個定義好的順序執行(使用RxJS combineLatest和/或類似的運營商,有很多,取決於你想達到什麼...)。如果所有的守衛都返回boolean而不是Observable或Promise,Guard執行的順序就是在路由中定義的順序 - 我無法想象Angular會改變執行順序。
它取決於調用的順序 –
我認爲Guard1是先執行的,但它是異步的。然後Guard2是錯誤的。我可以在開發人員工具中看到xhr請求被取消,但我不知道爲什麼。 –
你是在告訴警衛異步呼叫被取消了嗎? –