首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript InversifyJS:异步绑定

TypeScript InversifyJS:异步绑定
EN

Stack Overflow用户
提问于 2016-11-22 20:43:21
回答 1查看 860关注 0票数 1

我正面临着这样的问题:我正在创建具有处理几个具体提供者的能力的事件管理器,并且在这里我正在努力解决依赖注入问题。

我用:Typescript@2.0.10node@7.0.0inversify@2.0.1inversify-binding-decorators@2.0.0

让我们在代码中看到:

代码语言:javascript
复制
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,它使整个应用程序崩溃。但是..。当我从init中禁用kernel.getAll(...)时,我就收到了我所期望的结果:

代码语言:javascript
复制
const eventManager: IEventManager = kernel.get<IEventManager>(TYPES.IEventManager);
eventManager.init([]);
console.log(eventManager);

给我:MultipleProvidersEventManager { providers: {} }。init方法本身非常简单,包含:

代码语言:javascript
复制
@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;
    }

    ...
}

因此,我的问题是,我必须等待调用init方法,直到所有必需的对象正确地存储在InversifyJS容器中并可以返回。但我不知道怎么做:有人能解释一下我该怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-23 21:00:56

好吧,我已经解决了。

问题就在我刚开始思考的完全不同的地方。所以..。在init方法上的init类中,forEach正在释放调用方的上下文。添加bind解决了这个问题。

代码语言:javascript
复制
forEach(providers, this.registerProvider.bind(this));

..。是个无名氏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40751249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档