Цикл в объект для фильтрации получается, что иногда работает, а иногда нет Angular 11

#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 это не сработает, я пробовал это. Проблема возникает, когда я захожу на страницу с новой вкладки или на странице перезагрузки.