天天看點

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

源代碼:

getNextPageContext(): Observable<PageContext> {
    const a = this.store.pipe(select(RoutingSelector.getNextPageContext));
    console.log('Jerry next page context: ' + a);
    a.subscribe((b) =>{
      console.log(b);
    });
    return a;
  }      

單步調試:

a是調用類似ABAP open SQL從ngrx store裡select出來的一個store 引用:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

把store對象的operator字段取出來,存放到變量operator裡。

等價于:const operator = this.operator;

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

上圖第21行的變量ObserverOrNext, 即我們指定到subscribe調用裡的回調函數。

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

在toSubscriber.js檔案裡,把我們傳入到subscribe裡的回調函數,封裝成一個Subscriber執行個體。

Subscriber的destination字段,存儲的是SafeSubscriber執行個體,指向我們指定的回調函數。

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

_next存放的就是回調函數:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

operator:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

this和this.source的類型都是Store.

下面這行代碼相當于告訴this.store, 讓其通知subscriber了:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

DistinctUntilChangedSubscriber這個subscriber,就是普通的subscriber基礎上,包裹一層DistinctUntilChanged:

現在又要為DistinctUntilChangedSubscriber建立一個subscriber了:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

這裡終于調用store的_subscribe方法了:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

在ReplaySubject.js裡,手動調用subscriber的next方法:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

而next的輸入參數,這個_events數組裡有全局的action資料:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

@ngrx/store/update-reducers裡能看到所有的features:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

這裡能看出,輸入是上面介紹的一大串複雜的state和action結構,輸出就是homepage和content page的Pagecontext了。

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

而上圖29行的this.project, 應該是我們應用程式傳入的一個函數。

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

864行,一會再設定斷點:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

執行到53行時,再切換到ngrx-store.js裡,設定斷點:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

注意斷點的位置需設定準确:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

沒有成功,再試試map.js的第29行:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試
從ngrx store裡selector出來的Observable,執行subscribe的單步調試

cmsRequired

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

這裡是RouterState的初始狀态:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試

page.effect.ts:

從ngrx store裡selector出來的Observable,執行subscribe的單步調試