将 ngrx actions$ (Observable) 转换为 Promise
Convert ngrx actions$ (Observable) to Promise
我在将 Observable 转换为 Promise 以在 Angular APP_INITIALIZER
中使用时遇到问题
我的一部分app.module.ts:
import {Actions, ofType} from '@ngrx/effects';
import {MyEffects} from './store/my.effects';
import * as MyActions from './store/my.actions';
function loadPermissions(actions$: Actions) {
return () => actions$.pipe(ofType(MyActions.fetchPermissionsSuccess)).toPromise() // this promise is dead
}
@NgModule({
declarations: [AppComponent],
imports: [
StoreModule.forRoot({}, {}),
EffectsModule.forRoot([MyEffects]),
],
providers: [
{
provide: APP_INITIALIZER,
useFactory: loadPermissions,
deps: [Actions],
multi: true,
},
],
})
export class AppModule {}
正如我在评论中提到的,toPromise()
在源代码完成之前不会解析。
所以一个简单的方法来完成它,就是只取第一个:
actions$.pipe(
ofType(MyActions.fetchPermissionsSuccess),
take(1)
).toPromise();
我在将 Observable 转换为 Promise 以在 Angular APP_INITIALIZER
我的一部分app.module.ts:
import {Actions, ofType} from '@ngrx/effects';
import {MyEffects} from './store/my.effects';
import * as MyActions from './store/my.actions';
function loadPermissions(actions$: Actions) {
return () => actions$.pipe(ofType(MyActions.fetchPermissionsSuccess)).toPromise() // this promise is dead
}
@NgModule({
declarations: [AppComponent],
imports: [
StoreModule.forRoot({}, {}),
EffectsModule.forRoot([MyEffects]),
],
providers: [
{
provide: APP_INITIALIZER,
useFactory: loadPermissions,
deps: [Actions],
multi: true,
},
],
})
export class AppModule {}
正如我在评论中提到的,toPromise()
在源代码完成之前不会解析。
所以一个简单的方法来完成它,就是只取第一个:
actions$.pipe(
ofType(MyActions.fetchPermissionsSuccess),
take(1)
).toPromise();