为了解决此问题,您可以添加“take(1)”操作符来在第一次触发时停止订阅。这将确保触发事件仅会进行一次请求。以下是示例代码:
import {
Injectable,
NgZone
} from '@angular/core';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class ServerSentEventsService {
constructor(private ngZone: NgZone) {}
getServerSentEvent(url: string): Observable {
return Observable.create(observer => {
const eventSource = new EventSource(url);
eventSource.onmessage = event => {
this.ngZone.run(() => observer.next(event));
};
eventSource.onerror = error => {
this.ngZone.run(() => observer.error(error));
};
return () => {
eventSource.close();
};
}).take(1);
}
}
我们在Observable创建之后添加了“ .take(1) ”。这将关闭Observable,以便在第一次触发后不再调用它。
请注意,您需要从“Rxjs/Observable”导入“ take”操作符。
在这种情况下,我们没有必要再监听EventSource的“ onopen”事件,因为它实际上只会在首次订阅后发生。