Я слежу за примерами Angular о героях и сконструировал (я думаю) мою версию кода идентично, но не получаю ожидаемого поведения.
Мой сервис
import { Injectable } from '@angular/core';
import { PORTS } from './mock-ports'
import { Port } from './port'
import { Observable, of } from 'rxjs';
import { HttpClient, HttpHeaders } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class UpdateportsService {
private controller_url = '/gelante/getports/150013889525632'
private controller_ip = 'http://localhost:8080'
getPorts(): Observable<Port[]> {
return this.http.get<Port[]>(this.controller_ip + this.controller_url)
}
constructor(private http: HttpClient) { }
}
myObserver (используется для отладки)
const myObserver = {
next: x => console.log('Observer got a next value: ' + x),
error: err => console.error('Observer got an error: ' + err),
complete: () => console.log('Observer got a complete notification'),
};
getPorts (подписывается на наблюдаемую службу)
// This is part of the same class as getPorts
ports: Port[] = [];
getPorts(): void {
// To subscribe to an observable, you take the declared observable, which in
// this case is getPorts (which returns an array of ports) and then you
// subscribe to it. Anytime the observable is called it will emit values
// which are then sent to all subscribers.
console.log(this.ports)
this.updateportsService.getPorts().subscribe(ports => this.ports = ports);
// This prints all of my port data as expected
this.updateportsService.getPorts().subscribe(myObserver);
console.log(this.ports)
}
Полный вывод из консоли отладки
Array(0) []
switch.component.ts:76
Array(0) []
switch.component.ts:82
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
core.js:40917
Observer got a next value: [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
switch.component.ts:13
Observer got a complete notification
switch.component.ts:15
[WDS] Live Reloading enabled.
Цель
Цель состоит в том, чтобы составить список интерфейсов коммутатора, которые я получаю от REST API (отдельно от Angular), и назначить их в список словарей, называемых портами. Это должно быть выполнено в строке:
this.updateportsService.getPorts().subscribe(ports => this.ports = ports);
Задача
В примере с героями должны быть заполнены примеры портов в функции getPorts. Как из Wireshark, так и из некоторых отладочных выходных данных я подтвердил, что HTTP-запрос get работает должным образом. В частности, вы можете увидеть строку:
this.updateportsService.getPorts().subscribe(myObserver);
, что он получает большой массив объектов (как и ожидалось). Однако по какой-либо причине назначение в ports => this.ports = ports
, похоже, не работает. Значением портов всегда является пустой массив с нулевыми элементами. Однако я не смог понять, почему.