Uncaught (в обещании): TypeError: токен не определен - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть приложение Angular 8, и оно хорошо работает в режиме разработки, но если я выполняю 'ng serve --prod', оно компилируется без ошибок, но при запуске приложения я получаю эту ошибку в консоли:

Ошибка: «Uncaught (в обещании): TypeError: токен не определен getOrCreateInjectable / bloomHa sh <@ <a href="http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:249524" rel="nofollow noreferrer">http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 249524 getOrCreateInjectable @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 249614 get @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 254632 PlayerComponent @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 726594 factory @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 728189 getNodeInjectable @ http://localhost: 4200 / main.cf6fe5006f05f980ad3b. js: 1: 253710 ...

У вас есть представление о том, как определить, что идет не так? ошибка, у меня вызван PlayerComponent, но в

import { Game, IsoScene } from 'src/app/tars/classes';
import { NavigatorService } from 'src/app/tars/services';
import { DataProvider, ElementProvider } from 'src/app/tars/providers';
import { ElementProvider as POCElementProvider } from 'src/app/services/element.provider';
import { IsoPlayerScene } from 'src/app/classes/scenes/iso';
import { InteractionsMenu } from 'src/app/interfaces';
import { DataProviderFactory } from 'src/app/services/dataProviders/factory.service';
import { OnReadyRenderer2DEvent, Interaction } from 'src/app/tars/interfaces';
import { TitleScene } from 'src/app/classes/scenes/title';

@Component({
  selector: 'tars-player',
  templateUrl: './player.component.html',
  styleUrls: ['./player.component.scss']
})
export class PlayerComponent {
  private rendererW: number;
  private rendererH: number;

  public get rendererHeight(): number {
    return this.rendererH;
  }

  public get rendererWidth(): number {
    return this.rendererW;
  }

  private game: Game;
  private navigatorService: NavigatorService;
  private dataProvider: DataProvider;
  private elementProvider: ElementProvider;

  private isoPlayer: IsoPlayerScene;
  public menuStructure: InteractionsMenu;

  constructor(
    private injector: Injector,
    private ngZone: NgZone
  ) {
    this.navigatorService = injector.get(NavigatorService);

    this.dataProvider = injector.get(DataProvider);
    this.dataProvider.set(injector.get(DataProviderFactory.factory()));

    this.elementProvider = injector.get(ElementProvider);
    this.elementProvider.set(injector.get(POCElementProvider));

    this.resetInteractionsMenu();
  }

  rendererOnReady(event: OnReadyRenderer2DEvent) {
    // Create the game object
    this.game = new Game(this.injector, event.context);
    this.game.onLoaded.subscribe((res: boolean) => {
      // Ask current client size
      this.refreshClientSize();
      // Run the game (when ready inside)
      this.ngZone.runOutsideAngular(() => this.game.run());
    });

    // Specific link
    this.isoPlayer = new IsoPlayerScene(this.injector, {name: 'world'}, event.context);
    this.isoPlayer.onInteractionsMenu.subscribe((structure: InteractionsMenu) => {
      this.ngZone.run(() => {
        if (structure) {
          this.menuStructure = structure;
        } else {
          this.resetInteractionsMenu();
        }
      });
    });

    this.game.load([
      this.isoPlayer,
      new TitleScene(this.injector, {name: 'title'}, event.context),
      new IsoScene(this.injector, {name: 'loader'}, event.context),
    ], 'title', 'loader');
  }

  // Listen the window resize event
  @HostListener('window:resize', ['$event'])
  onResize(event: any) {
    this.refreshClientSize();
    this.resetInteractionsMenu();
  }

  // Get the window/body size to set the graph size
  public refreshClientSize() {
    const browserSize = this.navigatorService.getClientSizeFromBrowser();
    this.rendererW = browserSize.width;
    this.rendererH = browserSize.height;
    this.navigatorService.setClientSize(browserSize.width, browserSize.height);
  }

  // Keyboard management
  @HostListener('window:keydown', ['$event'])
  onKeyPress(event: any) {
    this.navigatorService.keyDown(event);
  }

  private resetInteractionsMenu() {
    this.menuStructure = {
      interactions: [],
      screenCoord: { screenX: 0, screenY: 0 }
    };
  }

  // Do interaction when menu selection is done and reset menu
  menuOnSelect(interaction: Interaction) {
    this.isoPlayer.doInteraction(interaction);
    this.resetInteractionsMenu();
  }
}

нет ничего особенного * Как я уже сказал, он работает в dev и я не понимаю почему --prod дает этот результат.

РЕДАКТИРОВАТЬ:

Кажется, что это строка this.dataProvider.set(injector.get(DataProviderFactory.factory())); о заводе с кодом ниже, который разрывается на --prod

@Injectable()
export class DataProviderFactory {
  public static factory() {
    if (environment.dataOrigin === DataOrigin.Fake) {
      return Faker;
    } else {
      // ...
    }
  }
}

Если я заменю DataProviderFactory.factory() на Faker напрямую, это сработает. Я читал о какой-то проблеме с Ivy и creatInjector, но, кажется, не работает.

Есть идеи?

1 Ответ

0 голосов
/ 05 февраля 2020

В контексте --prod DataProviderFactory возвращает нулевое значение, которое инжектор не может обработать для токенизации. Так что не получится, мой плохой. Но исключение из списка не совсем понятно и полезно. Надеюсь, что это может помочь другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...