Angular2/typcript и SSE (EventSource)

Прежде всего, я новичок в ng2 и машинописи.

Я пытаюсь реализовать отправленные сервером события в компоненте Angular2. Я следовал за примерами, упомянутыми в предыдущих постах здесь, но моя проблема в том, что объект "EventSource" не распознается (красное подчеркивание, в VS Code).

Я не уверен, что мне не хватает некоторых ссылок... Мои ссылки:

<!-- IE required polyfills, in this exact order -->
  <script src="node_modules/es6-shim/es6-shim.min.js"></script>
  <script src="node_modules/systemjs/dist/system-polyfills.js"></script>
  <script src="node_modules/angular2/es6/dev/src/testing/shims_for_IE.js"></script>
  <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
  <script src="node_modules/systemjs/dist/system.src.js"></script>
  <script src="node_modules/rxjs/bundles/Rx.js"></script>
  <script src="node_modules/angular2/bundles/angular2.dev.js"></script>

Вот как я реализовал клиент источника событий:

   ngOnInit() {
      const observable = Observable.create(observer => {
        const eventSource = new EventSource(/API_URL); //Cannot find EventSource
        eventSource.onmessage = x => observer.next(x.data);
        eventSource.onerror = x => observer.error(x);

        return () => {
            eventSource.close();
        };
    });

    observable.subscribe({
        next: guid => {
            this.zone.run(() => this.someStrings.push(guid));
        },
        error: err => console.error('something wrong occurred: ' + err)
    });

2 ответа

На самом деле в TypeScript есть две вещи:

  • Время компиляции. Компилятор проверяет синтаксические ошибки и типы. Что касается типов, он опирается на d.ts Файлы, которые можно увидеть в файлах, описанных контрактами объектов / классов.
  • Время выполнения. Если объект присутствует в вашей среде выполнения, код будет выполнен.

В вашем случае проблема во время компиляции.

Вот пример файла d.ts для EventSource: https://github.com/sbergot/orgmodeserver/blob/master/src/ts/deps/EventSource.d.ts

Вы можете получить его и сослаться на него в самом начале вашего файла TypeScript следующим образом:

/// <reference path="../<path-to>EventSource.d.ts"/>
let eventSource = window['EventSource'];

TypeScript не знает о EventSource, который является частью окна. Таким образом, вы должны извлечь в первую очередь.

Смотрите: https://github.com/OasisDigital/sse-a2-example/blob/master/src/app/sse.ts

Вам нужно указать, что EventSource является функцией окна, а также необходимо передать с ней параметр.

const eventSource = new window['EventSource']("http://url")
Другие вопросы по тегам