1

저는 이러한 종류의 문제에 직면 해 있습니다. 저는 여러 가지 구체적인 공급자를 처리 할 수있는 이벤트 관리자를 만들고 있습니다. 여기서는 종속성 주입 문제로 고심하고 있습니다. 는 [email protected], [email protected], [email protected], [email protected]TypeScript InversifyJS : 비동기 바인딩

코드에 것을 볼 수 있습니다 :

내가 사용

const socketIO: SocketIO.Server = io.listen(instance); 
kernel.bind<SocketIO.Server>(TYPES.SocketIO).toConstantValue(socketIO); 

const eventManager: IEventManager = kernel.get<IEventManager>(TYPES.IEventManager); 
eventManager.init(kernel.getAll<IEventManagerProvider>(TYPES.IEventManagerProvider)); 
console.log(eventManager); 

을 그리고 콘솔이 나에게 해당 이벤트 관리자를 기록하여 전체 응용 프로그램을 충돌 undefined이다. 하지만 ... 나는 초기화에서 kernel.getAll(...), 그때 나는 내가 기대 한대로로 수신하고있어 사용하지 않으면 :

const eventManager: IEventManager = kernel.get<IEventManager>(TYPES.IEventManager); 
eventManager.init([]); 
console.log(eventManager); 

저를 제공합니다 : MultipleProvidersEventManager { providers: {} }. init 메소드는 그 자체로 매우 간단하고 포함

@provideSingleton(TYPES.IEventManager) 
class MultipleProvidersEventManager { 

    ... 

    public init(providers: IEventManagerProvider[]): void { 
     forEach(providers, this.registerProvider); 
    } 

    public registerProvider(provider: IEventManagerProvider): void { 
     if (this.providers[provider.type()]) { 
      throw new Error('Event Manager provider already registered'); 
     } 
     console.log('Registered ' + provider.type() + ' event manager provider'); 
     this.providers[provider.type()] = provider; 
    } 

    ... 
} 

그래서 내 문제는 내가 필요한 모든 객체가 InversifyJS 컨테이너에 제대로 저장되어 반환 될 수 때까지 init 메소드를 호출하여 기다릴 필요가 있다는 것입니다. 하지만 :(이. 누군가가 내가이 문제를 해결하는 방법을 나에게 설명 할 방법을 몰라?

+0

파일 어 ich는 코드가 포함되어 있습니다 : https://github.com/sdudziak/js-app-kickstarter/blob/master/src/server/bootstrap.ts –

답변

1

좋아, 내가 그것을 해결했습니다.

문제는 난에 생각 전혀 다른 위치에 시작. 그래서 ...을 MultipleProvidersEventManager 클래스 init 방법에 forEach는 호출자의 컨텍스트를 잃어버린했다. bind을 추가하면 문제를 soved ..

forEach(providers, this.registerProvider.bind(this)); 

... anwser입니다.

관련 문제