Angular 在rxjs 6中使用管道时,如何访问以前观察到的参数?
我目前正在从rxjs 5迁移到rxjs 6,我不知道如何从以前的可观察对象访问参数。我在rxjs 5中使用了以下代码:Angular 在rxjs 6中使用管道时,如何访问以前观察到的参数?,angular,rxjs,Angular,Rxjs,我目前正在从rxjs 5迁移到rxjs 6,我不知道如何从以前的可观察对象访问参数。我在rxjs 5中使用了以下代码: return this.userProvider.getCurrentUser().concatMap(currentUser => { return this.db.collection('chats').doc(room).collection<MessageModel>('messages', ref => ref.limit(25).
return this.userProvider.getCurrentUser().concatMap(currentUser => {
return this.db.collection('chats').doc(room).collection<MessageModel>('messages', ref => ref.limit(25).orderBy("date", "desc")).stateChanges(["added"])
.map(docChange => docChange.map(doc => {
const message = doc.payload.doc.data() as MessageModel;
message.sender = (message.senderId === currentUser.userId) ? currentUser : receiver;
return message;
}).reverse());
});
但是,通过这种方式,我无法访问currentUser,因为它只能在concatMap的范围内访问。如何重构代码以访问
currentUser
?谢谢。您可以将当前用户与另一个管道
和地图
返回此.userProvider.getCurrentUser()管道(
concatMap(当前用户=>
此.db.collection('chats').doc(房间)
.collection('messages',ref=>ref.limit(25).orderBy('date','desc')).stateChanges(['added'])
.pipe(map(docChange)=>({currentUser,docChange}))
),
map({currentUser,docChange})=>docChange.map(doc=>{
const message=doc.payload.doc.data()作为MessageModel;
message.sender=(message.senderId==currentUser.userId)?currentUser:receiver;
返回消息;
}).reverse())
);
在您最初的RxJs 5.x代码中,您似乎将逻辑.map(docChange=>..
应用于这个.db.collection('chats').doc(room.).collection(…..)的结果,这个结果可能是一个可观察的,它会发出一个类似MessageModel
(s)的数组
如果所有这些都是真的,那么你可以考虑一种接近你的RXJS代码的方法,沿着下面的行< /P>
return this.userProvider.getCurrentUser().pipe(
concatMap(currentUser =>
this.db.collection('chats').doc(room).collection<MessageModel>('messages', ref => ref.limit(25).orderBy('date', 'desc')).stateChanges(['added'])
.pipe(
map(
docChange => docChange.map(doc => {
const message = doc.payload.doc.data() as MessageModel;
message.sender = (message.senderId === currentUser.userId) ? currentUser : receiver;
return message;
}).reverse()
)
)
)
);
返回此.userProvider.getCurrentUser()管道(
concatMap(当前用户=>
此.db.collection('chats').doc(room).collection('messages',ref=>ref.limit(25).orderBy('date','desc')).stateChanges(['added'])
.烟斗(
地图(
docChange=>docChange.map(doc=>{
const message=doc.payload.doc.data()作为MessageModel;
message.sender=(message.senderId==currentUser.userId)?currentUser:receiver;
返回消息;
}).reverse()
)
)
)
);
在这里,我们将map
操作符直接导入到db.collection
查询的结果中,这样我们就可以立即在currentUser
范围内找到它
我无法复制这个案例,因此这只是一个推测,而且这个方法必须经过验证。我希望你能理解它背后的想法
return this.userProvider.getCurrentUser().pipe(
concatMap(currentUser =>
this.db.collection('chats').doc(room).collection<MessageModel>('messages', ref => ref.limit(25).orderBy('date', 'desc')).stateChanges(['added'])
.pipe(
map(
docChange => docChange.map(doc => {
const message = doc.payload.doc.data() as MessageModel;
message.sender = (message.senderId === currentUser.userId) ? currentUser : receiver;
return message;
}).reverse()
)
)
)
);