хорошо, у меня есть следующий метод в службе 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)
);
}
исправлено, надеюсь на ваше быстрое решение, спасибо! :)
вы можете использовать канал, может быть, он работает this._controlCargaService.getPedidos().pipe(take(1)).subscribe(.....);
Я думаю, что если вы хотите делать что-то в реальном времени, лучшим решением будет работа с веб-сокетами вместо 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/веб-сокеты
Хороший ответ, тогда посмотри, спасибо
Пожалуйста, предоставьте весь соответствующий код. Покажите, как подписывается этот наблюдаемый объект, покажите, что такое
refresh$
.