Угловая наблюдаемая не улавливает новые значения с сервера фляги - PullRequest
0 голосов
/ 18 марта 2019

Моя проблема в том, что я хочу читать данные с сервера, как они поступают в угловом приложении, без перезагрузки страницы.У меня есть простой флеш-сервер, который отправляет данные в Python:

from threading import Timer
from flask import Flask
import time
import random
from datetime import datetime
from flask_cors import CORS, cross_origin

app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

string = ''
humidity = 60
stress = 1
temperature = 20

def update_data(interval):
    Timer(interval, update_data, [interval]).start()

    global string
    global humidity
    global stress
    global temperature

    string = ''
    string += f'{{"ID":"90A2DA10F2E4",'
    string += f'"timestamp":"{datetime.now().isoformat()}",'
    string += f'"temperature":{temperature},'
    string += f'"humidity":{humidity},'
    string += f'"stress":{stress}}}\n'


    humidity = round( (humidity + (random.random()*2-1)), 2)
    stress = round( (stress + (random.random()*0.2-0.1)), 2)
    temperature = round( (temperature + (random.random()*0.2-0.1)), 2)

# update data every second
update_data(1)

@app.route("/")
@cross_origin()
def index():
    return string

if __name__ == "__main__":
    app.run(debug=True)

И компонент в Angular, который создает подписку на этот поток:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'prototype';
  darkTheme =  new FormControl(false);
  list = [];

  constructor(private streamService: TestDataService,
              private http: HttpClient) { }

  ngOnInit() {
    this.privateServer();
  }

  privateServer() {
    console.log("private server");
    console.log(this.http.get('http://localhost:5000'));
    this.http.get('http://localhost:5000').subscribe( data => {
      console.log(data);
      this.list.push(data);
    })
  }

  onClick(){
    console.log(this.list);
  }
}

Это будет частью службы, но в целях тестирования я пытаюсь заставить его работать внутри компонента.Шаблон состоит из кнопки, которая вызывает onClick ().Любая помощь будет оценена.

1 Ответ

2 голосов
/ 18 марта 2019

В Angular методы запроса HttpClient предназначены для complete, как только Observable создает значение. Таким образом, после того, как обратный вызов подписки запущен, наблюдаемое завершено (больше не будет запускаться).

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


Для веб-сокетов:

https://medium.com/dailyjs/real-time-apps-with-typescript-integrating-web-sockets-node-angular-e2b57cbd1ec1

https://medium.com/factory-mind/angular-websocket-node-31f421c753ff


Для опроса:

https://nehalist.io/polling-in-angular/

https://stackoverflow.com/a/41658823/1331040

...