如何从回调函数使用ngrx/angular5从效果返回?
我的效果是:如何从回调函数使用ngrx/angular5从效果返回?,angular,ngrx,ngrx-effects,Angular,Ngrx,Ngrx Effects,我的效果是: @Effect() /* sends request to httpService with params as login credentials on instance of loginAction. */ login$: Observable<Action> = this.actions$ .instanceOf(LoginActions.LoginAction) .switchMap( action => {
@Effect() /* sends request to httpService with params as login credentials on instance of loginAction. */
login$: Observable<Action> = this.actions$
.instanceOf(LoginActions.LoginAction)
.switchMap(
action => {
return this.loginHttpService.login(action.payload)
.map( (res: any) => {
const firstName = res.firstName;
const lastName = res.lastName;
// const privileges = res.privileges
const privileges = ['ViewDeliverableDefinitions', 'SubmitDeliverableInstances']
this.tokenService.setPrivileges(privileges)
console.log('observable')
return Observable.create(observer => {
console.log('this is 1')
this.permissionsService.loadPermissions(privileges, () => {
console.log('this is 2')
// observer.next({
// type: 'string'
// });
this.store.dispatch(new LoginActions.LoginSuccessAction({user: res}))
// return observer.complete();
})
})
})
.catch( (e:any) => {
this.store.dispatch(new LoginActions.LoginFailureAction(true));
return Observable.create(observer => {
return observer.complete();
})
});
});
@Effect()/*向httpService发送请求,其中参数作为loginAction实例上的登录凭据*/
login$:Observable=this.actions$
.instanceOf(LoginActions.LoginAction)
.开关图(
动作=>{
返回此.loginHttpService.login(action.payload)
.map((res:any)=>{
const firstName=res.firstName;
const lastName=res.lastName;
//const privileges=res.privileges
const privileges=['ViewDeliverableDefinitions','SubmitDeliverableInstances']
this.tokenService.setPrivileges(privileges)
console.log('observable')
返回可观察的。创建(观察者=>{
console.log('这是1')
this.permissions服务.loadPermissions(特权,()=>{
console.log('这是2')
//下一个({
//键入:“字符串”
// });
this.store.dispatch(new LoginActions.loginsAccessAction({user:res}))
//返回observer.complete();
})
})
})
.catch((e:any)=>{
this.store.dispatch(newloginactions.LoginFailureAction(true));
返回可观察的。创建(观察者=>{
返回observer.complete();
})
});
});
但是,从未从
Observer.create调用任何内容。我做错了什么?有几件事需要更新。第一个map
需要是前面建议的switchMap
。这是因为效果
必须返回发出动作
的可观察
。这样做将导致内部可观察到订阅。其次,效果将为您执行此操作,而不是手动分派操作,因此您只需要在每个创建的可观察对象中发出一个新操作
更新代码(减去注释):
@Effect()/*向httpService发送请求,其中参数作为loginAction实例上的登录凭据*/
login$:Observable=this.actions$
.instanceOf(LoginActions.LoginAction)
.开关图(
动作=>{
返回此.loginHttpService.login(action.payload)
.switchMap((res:any)=>{
const firstName=res.firstName;
const lastName=res.lastName;
const privileges=['ViewDeliverableDefinitions','SubmitDeliverableInstances'];
this.tokenService.setPrivileges(privileges);
返回新的可观察对象(观察者=>{
this.permissions服务.loadPermissions(特权,()=>{
next(newloginactions.loginsAccessAction({user:res}));
observer.complete();
});
});
})
.catch((e:any)=>{
可观察的返回值(新登录操作.LoginFailureAction(true));
});
什么意思没有被调用?只有当请求中出现错误时,你才应该被捕获。如果你想返回另一个可观察对象,你应该使用flatMap
或switchMap
为什么需要这样做?@Envil,否则原始可观察对象将发出另一个观察对象不可移动,这反过来需要订阅。通过使用switchMap
,我们可以链接可观察对象,这样只需要一个订阅。@AdrianF–ciu,console.log('observable'))
触发。但是这是1
和这是2
当我尝试时,不要出现错误:Obervable不可分配给type'Observable
您需要使用类型信息更新创建的Observable。我已更新了答案。type Observable不可分配给type Observable
什么方法抱怨这一点吗?switchMap
,catch
?是否执行loginsccessaction
执行操作
?它在第26行抱怨,这是@Effect()
。是的,loginsccessaction
执行操作