1

我有兩個衛隊,Guard1和Guard2。 Guard1返回一個Observable,Guard2返回布爾值。多個衛兵調用異步功能

canActivate:[GUARD1,GUARD2]

假設GUARD2將返回false,是從GUARD1請求自動取消?或者電話會被執行呢?

+0

它取決於調用的順序 –

+0

我認爲Guard1是先執行的,但它是異步的。然後Guard2是錯誤的。我可以在開發人員工具中看到xhr請求被取消,但我不知道爲什麼。 –

+0

你是在告訴警衛異步呼叫被取消了嗎? –

回答

1

Guard1的請求將被取消,Guard2對此負責。我將它與if聲明進行了比較,在聲明中將條件與&&結合起來,除了未定義Guards的執行次序/結果(由於一些Guards可能是異步並且有些不是 - 並且您希望它們運行平行,大部分時間)。如果任何條件/ Guard返回false,則總體結果爲false,如果其中一個已返回false,則不需要評估/等待任何其他條件/ Guard,因此正在運行的請求將被取消。

如果你依賴所有的守衛(從守衛發射的請求)執行直到他們全部完成 - 但是這樣做不僅僅是守護路線,還有其他方法可以實際控制這種情況。當我遇到這種情況時,我會更詳細地解釋這一點:

我創建了一個簡單的HTTP緩存,以將請求數保持爲低。我有一個請求只在一個衛隊內被解僱,但是這個請求從未完成,因爲其他衛兵先前返回了錯誤,並且請求被取消了。這個請求從來沒有被緩存,因爲我沒有得到任何結果,因爲請求總是被取消(簡化版本聽起來毫無用處,但它證明了我想說的話)。然後,我這樣做:

  • 我創建了一個「包裝」可觀察的衛隊returnes作爲他的結果是
  • 這種「包裝」可觀察只是傳遞請求的結果(第二可觀察)回來,作爲結果衛兵
  • 角只會「取消」返回「包裝」可觀的,因此請求將完成,即使「包裝」可觀察將被取消

這樣的:

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會改變執行順序。