Как решить ERROR TypeError: xxx не является функцией? - PullRequest
0 голосов
/ 22 июня 2019

У меня есть служба, которая возвращает Promise<???> для всех функций (кстати, это хорошая практика?) Например,

@Injectable()
export abstract class MyService {
  abstract getCategories(): Promise<Category[]>;
}

У меня есть два impl, один локальный для тестирования в изоляции и другой удаленный для когдаdeployed.

@Injectable({
  providedIn: 'root'
})
export class MyServiceLocalImpl implements MyService {
  getCategories(): Promise<Category[]> {
    return Promise.resolve(this.data.categories);
  }
}   

Теперь, когда я внедряю службу в компонент, я не могу получить значение Promise, так как получаю ошибку времени выполнения:

import {MyService} from "../services";

@Component({
  selector: 'some-component',
  templateUrl: './some-component.component.html',
  styleUrls: ['./some-component.component.scss']
})
export class SomeComponent implements OnInit {
  private service: MyService;

  private categories: Category[];

  constructor(service: MyService) {
    this.service = service;
  }  

  ngOnInit() {
    this.service.getCategories().then( categories => {
      this.categories = categories;
    });
  }  
}

Ошибка времени выполнения:

ERROR TypeError: this.service.getCategories is not a function

ОБНОВЛЕНИЕ это мой app.module.ts

@NgModule({
  declarations: [
    AppComponent,
    SomeComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    HttpClientXsrfModule.withOptions({
      cookieName: 'Csrf-Token',
      headerName: 'Csrf-Token',
    }),
    BootstrapModule,
    FormsModule,
    BrowserAnimationsModule
  ],
  providers: [
    AppService,
    {
      multi: true,
      provide: HTTP_INTERCEPTORS,
      useClass: AppHttpInterceptorService
    },
    {
      multi: true,
      provide: MyService,
      useClass: MyServiceLocalImpl
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

1 Ответ

1 голос
/ 22 июня 2019

multi: true означает, что «сервис», связанный с токеном, на самом деле является массивом реализаций сервисов.

Возьмите токен HTTP_INTERCEPTORS, например: он используется для ссылки на все перехватчики HTTP. Служба http получает все перехватчики в виде массива от инжектора и вызывает их один за другим.

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