Компонент Angular не загружается в браузере из-за подписки Observable

В этом компоненте, когда я вызываю функцию getCurrentSalahOrIqamah в ngOninit, мой компонент не загружается в браузере. и продолжайте застревать. Я пробовал использовать оба компонента с отложенной загрузкой и активной загрузкой, но проблема не была решена.

import { Component, OnDestroy, OnInit } from '@angular/core';
import { SubSink } from 'subsink';
import { interval, map } from 'rxjs';

@Component({
      selector: 'app-timingscreen',
      standalone: true,
      imports: [],
      providers: [],
      templateUrl: './timingscreen.component.html',
      styleUrl: './timingscreen.component.scss'
    })
export class TimingscreenComponent {
  private subs = new SubSink()

ngOnInit(): void {
    this.getCurrentSalahOrIqamah()
  }
  getCurrentSalahOrIqamah() {
    this.subs.sink = interval(1000).pipe(
      map(() => {
        const date = new Date();
        return date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds();
      })
    ).subscribe(
      {
        next:(timeInSeconds:number)=>{
          console.info(timeInSeconds)
        }
      }
    )
    
  }
  ngOnDestroy(): void {
    this.subs.unsubscribe()
  }

}

Угловая версия: «^17.2.0». Версия Rxjs: «~ 7.8.0»

В этом коде нет операции блокировки потоков, поэтому маловероятно, что то, что вы говорите, является фактом. Пожалуйста, предоставьте минимальный воспроизводимый пример вашей проблемы, чтобы мы могли продолжить расследование.

MGX 16.04.2024 15:42

позвольте мне создать еще одно угловое приложение. и попробуйте с этим кодом. Я буду обновлять вас здесь

Muhammad Shahab 16.04.2024 16:15
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
2
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В Angular 17 рендеринг на стороне сервера (SSR) включен по умолчанию. Однако могут возникнуть трудности с завершением процесса рендеринга, если ваш код содержит интервалы, которые постоянно меняются. Следующий код может помочь решить эту проблему:

import { isPlatformBrowser } from '@angular/common';
import { Component, DestroyRef, OnInit, PLATFORM_ID, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { interval, map } from 'rxjs';
import { SubSink } from 'subsink';

@Component({
    selector: 'app-timingscreen',
    standalone: true,
    imports: [],
    providers: [],
    templateUrl: './timingscreen.component.html',
    styleUrl: './timingscreen.component.scss'
})
export class TimingscreenComponent implements OnInit {
    private subs = new SubSink()

    private destroyRef = inject(DestroyRef);
    private platformId = inject(PLATFORM_ID);

    ngOnInit(): void {
        if (isPlatformBrowser(this.platformId)) {
            this.getCurrentSalahOrIqamah();
        }
    }
    getCurrentSalahOrIqamah() {
        this.subs.sink = interval(1_000).pipe(
            takeUntilDestroyed(this.destroyRef),
            map(() => {
                const date = new Date();
                return date.getHours() * 3_600 + date.getMinutes() * 60 + date.getSeconds();
            })
        ).subscribe(
            {
                next: (timeInSeconds: number) => {
                    console.info(timeInSeconds);
                }
            }
        );
    }
}

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