Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从回调函数使用ngrx/angular5从效果返回?_Angular_Ngrx_Ngrx Effects - Fatal编程技术网

如何从回调函数使用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
执行
操作