Redux 如何保证一个用户只被呼叫一次,但在所有其他用户之前?

Redux 如何保证一个用户只被呼叫一次,但在所有其他用户之前?,redux,rxjs,Redux,Rxjs,我有一个RxJS监听器的redux状态,其中状态是一个可观察的状态,类似于: 类型状态={ 组织:阵列; 许可证:阵列 用户:用户; } 我有一组观察状态某些特定部分的观察者,另一组观察者订阅了这些观察者中的每一个 (状态:可观察)=>{ //观察者 const didChangeOrganizations:Observable=state.pipe( 映射({organization}=>组织), distinctUntilChanged() ); const didChangeUser:O

我有一个RxJS监听器的redux状态,其中状态是一个可观察的状态,类似于:

类型状态={
组织:阵列;
许可证:阵列
用户:用户;
}
我有一组观察状态某些特定部分的观察者,另一组观察者订阅了这些观察者中的每一个

(状态:可观察)=>{
//观察者
const didChangeOrganizations:Observable=state.pipe(
映射({organization}=>组织),
distinctUntilChanged()
);
const didChangeUser:Observable=state.pipe(
映射({user})=>user),
distinctUntilChanged()
);
const didChangeLicenses:Observable=state.pipe(
映射(({licenses})=>许可证),
distinctUntilChanged()
);
const userId=Observable=state.pipe(
map(({user})=>user.id),
distinctUntilChanged()
);
//观察员
didChangeUser.subscribe(用户=>{
const traits={…};
分析。识别(user.id、traits);
});
CombineTest(userId,didChangeLicenses)。订阅([userId,licenses])=>{
分析.识别(用户ID,{licenses});
});
...
CombineTest(userId,didChangeOrganizations)。订阅(
([userId,organizations])=>{
//如果还没有Org,我们知道这是用户第一次使用Org
//登录,在这种情况下,我们应该调用alias
如果(organizations.length==0){
analytics.alias(用户ID);
}
...
identify(userId,{org:…,orgUrl:…})
}
);
}
我面临的问题是,我必须调用
analytics.alias
一次(用户首次登录时),但必须在调用
analytics.identify
之前

每个订户独立地呼叫
identify
,观察自己的状态变化,这种变化可能随时发生


我如何构造观察者或观察者来处理这种依赖关系,我基本上可以“推迟”调用任何
identify
,直到只有在用户第一次登录时调用
alias

我想您可以尝试以下方法:

const firstTimeUser$=CombineTest(userId,didChangeOrganizations.pipe(share());
//对于具有“analytics.identify”的每个观察者,遵循相同的模式`
didChangeUser
.pipe(skipUntil(firstTimeUser$.pipe(延迟(0)))
.subscribe(用户=>{
const traits={…};
分析。识别(user.id、traits);
});
CombineTest(用户ID、didChangeLicenses)
.pipe(skipUntil(firstTimeUser$.pipe(延迟(0)))
.subscribe(([userId,licenses])=>{
分析.识别(用户ID,{licenses});
});
firstTimeUser$.subscribe(()=>/*…*/)
我们使用的是
share()
,因为
firstTimeUser$
订阅了三个位置,我们不想调用源代码三次。在数据生产者(例如:
CombineTest(userId,didChangeOrganizations)
)和数据消费者(例如
.subscribe()
skipUntil
的内部订阅者)之间放置
主题的
方法是什么

因此,运行我们的程序将开始收听事件,上面提到的
Subject
将有3个订户:

[
InnerSubscriber,//First`skipUntil`
InnerSubscriber,//第二个`skipUntil`
订阅服务器//来自'firstTimeUser$。订阅`
]
我们添加了
delay(0)
,因为我们希望
Subscriber
成为第一个接收值的订阅者,这是第一次和第二次调用
alias
的地方


由于我们使用的是
skipUntil(notifier)
,它将跳过值,直到
notifier
发出一次。

我想您可以尝试以下方法:

const firstTimeUser$=CombineTest(userId,didChangeOrganizations.pipe(share());
//对于具有“analytics.identify”的每个观察者,遵循相同的模式`
didChangeUser
.pipe(skipUntil(firstTimeUser$.pipe(延迟(0)))
.subscribe(用户=>{
const traits={…};
分析。识别(user.id、traits);
});
CombineTest(用户ID、didChangeLicenses)
.pipe(skipUntil(firstTimeUser$.pipe(延迟(0)))
.subscribe(([userId,licenses])=>{
分析.识别(用户ID,{licenses});
});
firstTimeUser$.subscribe(()=>/*…*/)
我们使用的是
share()
,因为
firstTimeUser$
订阅了三个位置,我们不想调用源代码三次。在数据生产者(例如:
CombineTest(userId,didChangeOrganizations)
)和数据消费者(例如
.subscribe()
skipUntil
的内部订阅者)之间放置
主题的
方法是什么

因此,运行我们的程序将开始收听事件,上面提到的
Subject
将有3个订户:

[
InnerSubscriber,//First`skipUntil`
InnerSubscriber,//第二个`skipUntil`
订阅服务器//来自'firstTimeUser$。订阅`
]
我们添加了
delay(0)
,因为我们希望
Subscriber
成为第一个接收值的订阅者,这是第一次和第二次调用
alias
的地方


由于我们使用的是
skipUntil(notifier)
,它将跳过值,直到
notifier
发出一次。

而不是
skipUntil
,rxjs中是否存在某种
等待
操作符?理想情况下,我希望它最终仍能调用,而不是跳过。到目前为止,我解决这个问题的唯一方法是在订阅之前将firstTimeUser$与didChangeUser$和didChangeLicenses$一起包含在CombineTest中。如果您不想跳过它,但只是等待它,您可以将
skipUntil(…)
替换为:
switchMap((v,idx)=>idx==0?firstTimeUser$.pipe(延迟(0)).pipe(映射到(v),取(1):of(v))
。使用
idx===0
我们可以等到
alias
启用