Как дождаться методов, вызываемых в подписке?

У меня есть следующий код:

clickEventsubscription: Subscription;
  constructor(
    private activatedRoute: ActivatedRoute,
    private newsService: NewsService,
    private app: AppComponent,
    private EventlistenerService: EventlistenerService,
    public modalController: ModalController
  ) {
    this.clickEventsubscription = this.EventlistenerService.getClickEvent().subscribe(() => {
      this.update();
    });
  }
  
  update() {
    this.resetParameters();
    this.ngOnInit();
  }

Я хочу дождаться сброса параметров(); завершена, а затем вызовите ngOnInit(); или какой-либо другой класс, потому что я хочу сначала сбросить параметры, чтобы загрузка, но параметры не были сброшены...

Вот мой полный код:

import { Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
import { IonInfiniteScroll } from '@ionic/angular';
import { ModalController } from '@ionic/angular';
import { ArticlePage } from '../article/article.page';
import { NewsService } from '../services/news.service';
import { AppComponent } from '../app.component';
import { EventlistenerService } from '../services/eventlistener.service';

@Component({
  selector: 'app-folder',
  templateUrl: './folder.page.html',
  styleUrls: ['./folder.page.scss'],
})
export class FolderPage implements OnInit {
  @ViewChild(IonInfiniteScroll, { static: true }) infiniteScroll: IonInfiniteScroll;

  clickEventsubscription: Subscription;

  public folder: string;
  data: any;
  page = 1;
  private country: string = '';
  private category: string = '';
  public search: string = '';
  public showInfiniteScroll: boolean = true;
  private language: string;
  private from: string;
  private to: string;
  private sortBy: string;

  constructor(
    private activatedRoute: ActivatedRoute,
    private newsService: NewsService,
    private app: AppComponent,
    private EventlistenerService: EventlistenerService,
    public modalController: ModalController
  ) {
    this.clickEventsubscription = this.EventlistenerService.getClickEvent().subscribe(() => {
      this.update();
    });
  }

  update() {
    this.resetParameters();
    this.ngOnInit();
  }

  ngOnInit() {
    this.folder = this.activatedRoute.snapshot.paramMap.get('id');
    this.checkCountry();
    this.checkCategory();
    this.checkSelectionInEverything();
    this.loadData();
  }

  checkCountry() {
    this.country = this.app.getCountry();
  }

  checkCategory() {
    this.category = this.app.getCategory();
  }

  checkSelectionInEverything() {
    this.language = this.app.getLanguage();
    this.from = this.app.getFrom();
    this.to = this.app.getTo();
    this.sortBy = this.app.getSortBy();
  }

  loadData() {
    if (this.search != '' || this.folder == 'top-headlines') {
      this.newsService.getData(this.folder, this.country, this.category, this.search, this.page, this.language, this.from, this.to, this.sortBy).subscribe(data => {
        // initial load of the data
        console.info(this.page);
        console.info(this.clickEventsubscription);
        if (this.page == 1) {
          this.data = data;
          console.info(data);
        }
        // append next articles to the data array
        else {
          let arr: any[] = data['articles'];

          for (let i = 0; i < data['articles'].length; i++) {
            this.data.articles.push(arr[i]);
          }
          this.checkIfAllArtriclesAreLoaded();
        }
      });
    }
  }

  moreData(event) {
    this.page++;
    this.loadData();

    setTimeout(() => {
      event.target.complete();
      // App logic to determine if all data is loaded
      // and disable the infinite scroll
    }, 500);
  }

  doRefresh(event) {
    this.resetParameters();
    this.loadData();

    setTimeout(() => {
      event.target.complete();
    });
  }

  resetParameters() {
    this.data = null;
    this.page = 1;
    this.country = '';
    this.category = '';
    this.search = '';
    this.language = '';
    this.sortBy = '';
    this.from = null;
    this.to = null;
    this.showInfiniteScroll = true;
  }

  checkIfAllArtriclesAreLoaded() {
    if (this.data['articles'].length >= this.data.totalResults) this.showInfiniteScroll = false;
  }

  async presentModal(article) {
    this.newsService.currentArticle = article;
    const modal = await this.modalController.create({
      component: ArticlePage,
      cssClass: 'my-custom-class'
    });
    return await modal.present();
  }


}

А вот код из моего EventListenerService:

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class EventlistenerService {

  private subject = new Subject<any>();

  sendClickEvent() {
    this.subject.next();
  }

  getClickEvent(): Observable<any> {
    return this.subject.asObservable();
  }

}

resetParameters — это синхронная функция, которая должна быть полностью запущена до вызова ngOnInit?

Sudhanshu Kumar 24.12.2020 17:11

@Ashu да, нужно полностью вызвать

schmelto 24.12.2020 17:13

так в чем проблема, если он работает полностью?

Sudhanshu Kumar 24.12.2020 17:15

Я думаю, что resetParametes работает медленно или не работает, вероятно, потому что я загружаю данные в ngOnInit только в том случае, если страница параметров == 1, но если я регистрирую это, страница всегда на 2 или выше ... @Ashu

schmelto 24.12.2020 17:18

Проблема в другом. Я не знаю, почему вы пытаетесь добиться этого, но вызывать ngOnInit() в своем коде — ужасная идея. Angular дает вам информацию о том, когда компонент инициализируется, вы не можете заставить компонент инициализировать себя в данный момент. Возможно, вы захотите использовать другую функцию init() со стратегией обнаружения изменений OnPush.

Marco 24.12.2020 17:21

@Marco Я обновил функцию update(), чтобы она не вызывала ngOnInit(), но все равно не работает :(

schmelto 24.12.2020 17:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ngOnInit вызывается только один раз при создании экземпляра директивы. Вы можете переместить код внутри ngOnInit в другую функцию и вместо этого вызвать ее;

Я обновил свой код, который я вызываю в другой функции, но все еще не работает

schmelto 24.12.2020 17:29

Вы где-то вызываете метод sendClickEvent?

Lucas SIlva 25.12.2020 04:59

да, я называю это другим методом, и это должно работать :)

schmelto 25.12.2020 15:13

Да, это была проблема :), но вчера он не полностью обновил ионную подачу, поэтому я не видел изменений на веб-сайте: / THX

schmelto 25.12.2020 15:16

Другие вопросы по теме