Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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
Angular 在rxjs 6中使用管道时,如何访问以前观察到的参数?_Angular_Rxjs - Fatal编程技术网

Angular 在rxjs 6中使用管道时,如何访问以前观察到的参数?

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).

我目前正在从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).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()
        )
    )
  )
);