在调用Web服务之前,我的服务类需要从状态中获取一个名为 dataForUpdate
的属性。目前,我是这样做的:
constructor(public _store: Store < AppState > ,
public _APIService: APIService) {
const store$ = this._store.select('StateReducer');
.../...
let update = this.actions$.filter(action => action.type == UPDATE)
.do((action) => this._store.dispatch({
type: REDUCER_UPDATING,
payload: action.payload
})) **
* GET STATE ** *= => .mergeMap(action => store$.map((state: AppState) => state.dataForUpdate).distinctUntilChanged(),
(action, dataForUpdate) {
return {
type: action.type,
payload: {
employee: action.payload,
dataForUpdate: dataForUpdate
}
};
}) *
AND CALL API *= => .mergeMap(action => this._APIService.updateEmployee(action.payload.employee, action.payload.dataForUpdate),
(action, APIResult) => {
return {
type: REDUCER_UPDATED
}
})
.share();
.../...
let all = Observable.merge(update, ....);
all.subscribe((action: Action) => this._store.dispatch(action));
}
我正在使用angular2-store-example (https://github.com/ngrx/angular2-store-example/blob/master/src/app/users/models/users.ts)作为指南。
我想知道是否存在更好(更清晰)的方法?
实时示例:https://plnkr.co/edit/WRPfMzPolQsYNGzBUS1g?p=preview
take()
操作符使得它对于存储可观察对象来说是同步的。在其他可观察对象中,你可能是正确的,理论上它可以是同步或异步的...但这取决于具体情况。在实践中,take()
操作符在处理大多数可观察对象时是同步的。 - Sasxastore.pipe(take(1)).subscribe()
。 (注:该代码是使用rxjs库中的pipe函数将Observable进行转换以便只发出第一个值,然后使用subscribe函数订阅Observable。) - PomPomtake(1)
并不会使它变成同步的,它只是让它发出一次信号,但仍然是异步的。 - sovemp