等待解析器中的状态(ngrx)

时间:2017-09-20 15:24:26

标签: angular ngrx resolver angular-router angular-router-guards

现在我有一个解析器调用标准服务并返回一个Observable:

return this.someService.getData()
      .map(data=> data.json())

我想用ngrx效果和存储替换它。当运行解析器时,我想调度由effect截取的requestAction,这会产生http请求。返回数据后,我将dataReceivedAction作为有效负载发送数据。

基本上我想在解析器中发送一个动作,并等到新数据在商店的一部分。我试着这样做:

return Observable.combineLatest(
      Observable.of(
        this.store.dispatch(new requestAction())
      ),
      this.store.select(store => store.dataIWaitFor),
      (dispatchedAction, dataArrived) => dataArrived
    )
      .skip(1)

它不起作用,我的意思是解析器不会渲染组件,但是在每个返回的Observable的末尾我添加

.do(data => console.log(data))

记录相同的数据。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

你可以做这样的事情

@Injectable()
export class SomeGuard implements CanActivate {
constructor(private store: Store<AppState>) {}

waitForDataToLoad(): Observable<Something> {
    return this.store.select(state => state.something)
        .filter(something => something && !something.empty);
}

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
    this.store.dispatch({type: LOAD_something});

    return this.waitForDataToLoad()
        .switchMap(() => {
            return Observable.of(true);
        });
    }
}
}