如何获取Observable数组列表中的最后一个元素



此函数用于从我的好友列表(onlineUserModel(中筛选可观察的全部消息,并获得字符串类型的可观察消息每个朋友的lastMessage

getLastMessage(onlineUserModel : OnlineUserModel): Observable<string>{
var messagesFriend= this.allDirectMessages$.pipe(map(x => x.filter(f=>f.fromOnlineUser.userName==onlineUserModel.userName)));
this.lastMessage$ = czt.pipe(map(last()))
return ...;
}

lastMessage是DirectMessage.messageModel.content中字符串的Obserable;它是一个字符串,因为如果消息是图片或语音,我会创建一个标准消息;你收到了一张照片或者。。。

lastMessage$ : Observable<string>
allDirectMessages$ : Observable<DirectMessage[]> 
<ul
class="user-list mt-2"
*ngFor="let onlineusermodel of onlineUsersModel$ | async"
(click)="
selectChat(onlineusermodel);
removeNotificationForUser(onlineusermodel)
"
>
<li class="user-list-item">
<div class="avatar avatar-online">
<img
[src]="onlineusermodel.profilePic"
class="rounded-circle"
alt="image"
/>
</div>
<div class="users-list-body">
<div>
<h5>
{{ onlineusermodel.userName }}
</h5>
<p>getLastMessage(onlineUserModel)</p>
</div>
<div class="last-chat-time">
<small class="text-muted">05 min</small>
<div
*ngIf="{
count: getUserNotification(onlineusermodel) | async
} as data"
>
<div class="new-message-count" *ngIf="data.count > 0">
{{ data.count }}
<!-- {{ getUserNotification(onlineusermodel) | async }} -->
</div>
</div>
</div>
</div>
</li>
</ul>

这是DirectMessage,包含来自OnlineUser


import { MessageViewModel } from "./messageViewModel";
import { OnlineUserModel } from "./onlineUserModel";
export class DirectMessage {
public fromOnlineUser: OnlineUserModel | null = {
userName: "",
email: "",
firstname: "",
profilePic: "",
isProfileComplete: "",
isActive: "",
};
public messages = "";
public messageModel: MessageViewModel = {
content: "",
timestamp: "",
from: null,
to: null,
avatar: "",
attachement: "",
fileSize: "",
fileNameSaved: "",
};

假设它们this.allDirectMessages$按时间顺序发出一个所有dms的数组,我认为您只需要:

getLastMessage$({ userName }: OnlineUserModel) {
return this.allDirectMessages$.pipe(
map<DirectMessage[], DirectMessage>((dms: DirectMessage[]) => {
const index: number = dms.lastIndexOf(
({fromOnlineUser}: DirectMessage) => fromOnlineUser.userName === userName
);
if (index === -1) {
return null;
} else {
return dms[index];
}
}),
map<DirectMessage, string>(this. getMsgFromDirectMsg)
);
}

假设CCD_ 2总是完成。如果它没有完成,那么返回的可观察对象也应该管道takeUntil(this.destroy$),其中destroy$是私有Subject<void>,并且存在的ngOnDestroy

ngOnDestroy(): void {
const d$ = this.destroy$;
if (d$) {
d$.next();
d$.complete();
}
}

此外,我不知道如何从Directmessage中获得实际的字符串,所以我不知道this.getMsgFromDirectMsg应该是什么样子。

最新更新