#javascript #angular #typescript #rxjs
#javascript #angular #typescript #rxjs
Вопрос:
Я разрабатываю логику друга в своем коде. Например, два пользователя могут дружить друг с другом. Пользователь 1 отправляет запрос пользователю 2, а пользователю 2 сообщается, что кто-то добавил вас в друзья. Затем 2 пользователя принимают это. Но если я выполняю итерацию от 1 пользователя до 2 пользователей и проверяю, являются ли они друзьями, иногда работает, а иногда нет. Проблема в том, что даже я друг, он снова говорит мне Add as friend
, что это не тот случай, который я хочу. Но иногда, если я перезагружаю страницу, это работает. Имейте в виду this.data.user
, что идентификатор friend
В запросе, который я обрабатываю, чтобы собрать мне всех друзей, возможно, есть проблема, почему он это делает.
Это мой код для проверки, являются ли они друзьями или нет, который вызывается at ngOnInit
.
checkFriend: User[] = [];
if(success[1]) {
this.data = success[0];
this.checkFriends(this.data.user);
} else {
this.modelDataService.getUserModel(this.outsideUserId).subscribe((t: Model) => {
this.data = t;
this.loadActiveUserConnections(this.data.user);
this.checkFriends(this.data.user);
}
this.modelDataService.getOutsideModel(this.outsideUserId).subscribe((t: Model) => {
this.data = t;
this.loadActiveUserConnections(this.data.user);
this.checkFriends(this.data.user);
} //The problem occurs here because here both are called from otuside
checkFriends(id) {
this.friendService.getAllFriendRequests().subscribe((finalRequesters) => {
this.checkFriend = finalRequesters;
this.checkFriend.forEach((oneRequest: any) => {
console.log(oneRequest);
if ((oneRequest.friendId === id || oneRequest.friendId === id) amp;amp; oneRequest.status === "You are friend") {
oneRequest.isFriend = true;
this.isFriend = true;
} else if (oneRequest.friendId === id amp;amp; oneRequest.status === "Request Pending") {
oneRequest.uniqueId = oneRequest.userId;
oneRequest.isRequest = true;
this.isRequest = true;
} else {
this.isFriend = false;
this.isRequest = false;
}
});
});
}
Это HTML-код.
<a class="px-1" *ngIf="!checkUser">
<button class="px-3 font-weight-600 btn btn-light" (click)="addFriend()" *ngIf="!isFriend amp;amp; !isRequest">
<span class="bi bi-person-plus-fill d-flex align-items-center">
<span class="pl-2">Add Contact</span>
</span>
</button>
<button class="px-3 font-weight-600 btn btn-light" *ngIf="isRequest">
<span class="bi bi-person-plus-fill d-flex align-items-center">
<span class="pl-2">Cancel Contact Request</span>
</span>
</button>
</a>
И это запрос.
getAllFriendRequests() {
return this.http.get<any[]>(this.apiBaseURL "/friends");
}
Вот как oneRequest
это выглядит.
{ createdDate: "2021-03-20T22:24:54.512Z"
friendId: "602e4c30e3346466703376ab"
id: "605676360fb6b109209674be"
status: "You are friend"
userId: "5fbc1bc72ffec245c4bd7725"
__v: 0
_id: "605676360fb6b109209674be"
__proto__: Object}
friendId
является идентификатором друга, userId
является аутентифицированным пользователем.
Но если я попытаюсь войти в консоль oneRequest
, он вернет мне весь массив объектов, а не только объект.
И вот как выглядит серверная часть.
async showUserCV(req, res) {
ModelData.aggregate()
let modelData = await ModelData.findOne({userUrl: req.params.id }).populate("user").exec();
if (!modelData) {
res.status(204).json({error: "No Data"});
return;
}
return res.status(200).send(modelData);
},
const ModelData = require("../models/data");
Комментарии:
1. возможно ли предоставить stackblitz с макетными данными?
2. @AakashGarg Я попробую.
3. @AakashGarg Но это будет сложно -_-, потому что код такой большой. Но я сделаю все возможное.
4. просто попробуйте воспроизвести макет сценария с минимальными возможностями.
5. Это всего лишь идея, но попробуйте вызвать
this.checkFriend = finalRequesters.body
функцию subscribe, поскольку вы получаете HttpResponse . ( angular.io/api/common/http/HttpResponse )
Ответ №1:
Если вы хотите выполнить цикл для перезаписи данных, вы можете использовать map() вместо forEach() . Попробуйте это:
this.checkFriend.map((oneRequest: any) => {
// Put what u want to do in loop here
}
Комментарии:
1. @Svanthna
map
это не сработает, я пробовал это. Проблема возникает, когда я захожу на страницу с новой вкладки или на странице перезагрузки.