Effect 在 Rxjs 6 中用两个 Observables 调用一次
Effect just call one time with two Observables in Rxjs 6
我在登录功能中有两个功能:获取盐然后登录
但是当我发送动作登录时,它只调用 1 次(一次加盐)
getSalt 和 logIn 在这里是可观察的。
我的效果写对了吗?需要一些帮助,我是 rxjs 的新手,谢谢!
我的效果
@Effect()
logIn$: Observable<any> = this.action$
.pipe(
ofType<LogIn>(AuthActionTypes.LOGIN),
map((action: LogIn) => action.payload),
switchMap(payload => {
return this.authService.getSalt(payload.username)
.pipe(
map(data => {
return this.authService.logIn(payload, data);
})
);
})
);
我得到盐
public getSalt(username: string): Observable<string> {
const url = `${host}/customers/${username}/salt`;
console.log('url salt', url);
return this._http.get<{ salt: string }>(url)
.pipe(
map(res => res.salt)
);
}
我的登录
public logIn({username, password}: { username: string, password: string }, salt: string) {
/../
return this._http.get(url, {params, headers});
}
我想因为使用 switchMap 因为它会取消之前的发射,你可以将它更改为 concatMap
或 mergeMap
另外,如果不在效果中调度动作,这是如何工作的?我认为这应该会引发错误,如果你不想在效果中发送一个动作(如 return),你可以 @Effect({ dispatch: false })
你映射到一个 login
Observable 所以你应该使用 switchMap
而不是 map
:
switchMap(payload => this.authService.getSalt(payload.username).pipe(
switchMap(data => this.authService.logIn(payload, data))
))
我在登录功能中有两个功能:获取盐然后登录 但是当我发送动作登录时,它只调用 1 次(一次加盐) getSalt 和 logIn 在这里是可观察的。
我的效果写对了吗?需要一些帮助,我是 rxjs 的新手,谢谢!
我的效果
@Effect()
logIn$: Observable<any> = this.action$
.pipe(
ofType<LogIn>(AuthActionTypes.LOGIN),
map((action: LogIn) => action.payload),
switchMap(payload => {
return this.authService.getSalt(payload.username)
.pipe(
map(data => {
return this.authService.logIn(payload, data);
})
);
})
);
我得到盐
public getSalt(username: string): Observable<string> {
const url = `${host}/customers/${username}/salt`;
console.log('url salt', url);
return this._http.get<{ salt: string }>(url)
.pipe(
map(res => res.salt)
);
}
我的登录
public logIn({username, password}: { username: string, password: string }, salt: string) {
/../
return this._http.get(url, {params, headers});
}
我想因为使用 switchMap 因为它会取消之前的发射,你可以将它更改为 concatMap
或 mergeMap
另外,如果不在效果中调度动作,这是如何工作的?我认为这应该会引发错误,如果你不想在效果中发送一个动作(如 return),你可以 @Effect({ dispatch: false })
你映射到一个 login
Observable 所以你应该使用 switchMap
而不是 map
:
switchMap(payload => this.authService.getSalt(payload.username).pipe(
switchMap(data => this.authService.logIn(payload, data))
))