Rxjs Redux Observable:find()不';我什么也不退

Rxjs Redux Observable:find()不';我什么也不退,rxjs,redux-observable,Rxjs,Redux Observable,我对RxJs非常陌生,到目前为止只使用过Redux(+Thunk),所以我试图了解所有东西是如何协同工作的。我目前正试图从一个源(json文件)获取一个用户,其中包含从登录表单提交的数据 authEpic.js import users from '../api/users.json'; const source = of(users); export const authEpic = (action$) => action$.pipe(

我对RxJs非常陌生,到目前为止只使用过Redux(+Thunk),所以我试图了解所有东西是如何协同工作的。我目前正试图从一个源(json文件)获取一个用户,其中包含从登录表单提交的数据

authEpic.js

    import users from '../api/users.json';
    
    const source = of(users);
    
    export const authEpic = (action$) => action$.pipe(
    ofType("AUTH_LOGIN_REQUEST"),
    switchMap(({ authData }) => source.pipe(
        find(user => authData.email === user.email && authData.password === user.password),
        map(user => ({ type: "RESULTS", results: user }))
    ))
);
但是没有返回任何内容,即使它表示作为属性返回的值。我想了解如何找到一个用户并将其传递给另一个操作,因为尽管我到处查看,但目前我几乎一无所知

非常感谢你的帮助

问题是(用户)的
发出一个值:无论
用户
是什么,都可能是一个数组。因此,在您的
find()
中,参数
user
实际上是完整的
用户
,而不是单个用户,因此
users.email==undefined
find()
操作符的作用与数组的
find()
类似,因为它总是返回(发出)一个值,因此如果没有找到任何值,则返回(发出)的值实际上就是未定义的值。这就是这里发生的事情。您正在发出一个动作
{type:'RESULTS',RESULTS:undefined}

如果
users
确实是一个数组,那么您可能希望使用
from(users)
,以便每个用户都由可观察的对象逐个发出。然后它就如我想象的那样工作了。下面是一个演示:

如果这最终成为生产代码,您将需要处理找不到用户匹配项的情况


顺便说一句,我认为这不是生产代码(所有密码都以明文形式在本地作为json文件),但对于任何阅读本文的人来说,请注意,在这种特殊情况下,使用数组而不是可观察的可能会更清楚:

export const authEpic=(action$)=>
动作$.pipe(
ofType('AUTH\u LOGIN\u REQUEST'),
//注意,这现在是'map'而不是'switchMap'`
映射({authData})=>{
const user=users.find(
(用户)=>
authData.email===user.email&&authData.password===user.password
);
//如何处理不匹配(例如错误的电子邮件或密码)
如果(!用户){
返回{type:'NO_RESULTS'};
}
返回{type:'RESULTS',RESULTS:user};
})
);

非常感谢您的详细解释@jayphelp。这绝对不是生产代码,只是一些理解RxJS的游戏代码。