Несколько вызовов в методе get

хорошо, у меня есть следующий метод в службе angular-cli, я использую его для обновления таблицы в «реальном времени», pipe и tap, они работают так, как я хочу, плохо то, что он делает запрос http.get постоянно и, очевидно, это то, что он делает, используя память браузера. Я знаю, что могу сделать метод POST и добавить канал и нажать там, я добавляю кнопку в свой интерфейс, чтобы добавить новую запись, и она обновляется в режиме реального времени (это работает и идеально). К сожалению, метод http.POST, который я использую, находится в .dart / flutter. Вот почему я использую pipe и tap в своем угловом методе http.GET getOrders, поэтому я наблюдаю за изменениями, но я хочу наблюдать за изменениями, пока они есть. Но происходит то, что этот вызов за вызовом API спрашивает, была ли добавлена ​​​​еще одна новая запись, если она правильная, она обновляет представление. Как мне это решить?

control-de-carga-service.ts

     private _refresh$ = new Subject<void>();

     get refresh$(){
         return this._refresh$;
     }

    getPedidos():Observable<any>{
     let headers = new HttpHeaders().set('Content-Type','application/x-www-form-urlencoded');
     return this._http.get(this.url+'control-de-carga/pedidos',{headers: headers})
     .pipe(
        tap(() => {
          this._refresh$.next();
        })
     );
   }

и pedidos-linea.component.ts

    ngOnInit(): void {
       this.getPedidos();
       this.subscription = this._controlCargaService.refresh$.subscribe(() 
        => {
           this.getPedidos();
       })
    }

    getPedidos(): void {
       this._controlCargaService.getPedidos().subscribe(
       (res) =>{ 
                this.pedidos_list = res;
                console.info(res);
              },
       (err) => console.error(err)
     );
   }

Пожалуйста, предоставьте весь соответствующий код. Покажите, как подписывается этот наблюдаемый объект, покажите, что такое refresh$.

Chris Hamilton 08.04.2022 14:20

исправлено, надеюсь на ваше быстрое решение, спасибо! :)

Eric Efrain Almendras Arnez 08.04.2022 14:29

вы можете использовать канал, может быть, он работает this._controlCargaService.getPedidos().pipe(take(1)).subscri‌​be(.....);

Suresh Panigrahi 08.04.2022 14:34
Тестирование функциональных 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
1
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что если вы хотите делать что-то в реальном времени, лучшим решением будет работа с веб-сокетами вместо HTTP-запросов.

В другом решении вы можете выполнять метод каждые N секунд (конечно, в этом случае он не будет работать в режиме реального времени, но будет выглядеть как в режиме реального времени).

Надеюсь, я помог вам!

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

Вы создали бесконечный цикл, подписавшись на getPedidos() вызовы refresh$.next(), которые затем вызывают getPedidos(), которые затем вызывают refresh$.next() и т. д.

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

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

Вот некоторые ресурсы для начала:

https://indepth.dev/tutorials/angular/how-to-implement-websockets-in-angular-projecthttps://javascript-conference.com/blog/real-time-in-angular-a-journey-into-websocket-and-rxjs/https://docs.flutter.dev/cookbook/networking/веб-сокеты

Хороший ответ, тогда посмотри, спасибо

Eric Efrain Almendras Arnez 08.04.2022 15:22

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