3

我有一个连接到远程服务的 ES2015 类。

问题是我的代码在它的对象完成连接到远程服务器之前尝试访问这个类。

如果对象尚未完成初始化,我想确保方法不只是给出错误。

我的类中有很多方法依赖于连接的启动和运行,所以如果有一个单一的、易于理解的机制可以应用于所有方法,比如@ensureConnected 装饰器,那就太好了。

在这里摆弄:https ://jsfiddle.net/mct6ss19/2/

'use strict';

class Server {
    helloWorld() {
        return "Hello world"
    }
}

class Client {
    constructor() {
            this.connection = null
            this.establishConnection()
    }

    establishConnection() {
        // simulate slow connection setup by initializing after 2 seconds
        setTimeout(() => {this.connection= new Server()}, 2000)
    }

    doSomethingRemote() {
            console.log(this.connection.helloWorld())
    }

}

let test = new Client();
// doesn't work because we try immediately after object initialization
test.doSomethingRemote();
// works because the object has had time to initialize
setTimeout(() => {test.doSomethingRemote()}, 3000)

我正在使用 ES7 装饰器进行成像以执行测试以查看连接是否已建立,但我不知道如何执行此操作。

4

2 回答 2

3

我不会在构造函数中启动连接。构造函数更多地是为初始化变量等而设计的,而不是程序逻辑。相反,我会establishConnection从您的客户端代码中调用自己。

如果要在构造函数中执行此操作,请将结果存储在实例变量中,然后在 中等待它doSomethingRemote,如:

class Client {
    constructor() {
        this.connection = this.establishConnection();
    }

    establishConnection() {
        // simulate slow connection setup by initializing after 2 seconds
        return new Promise(resolve => setTimeout(() =>
          resolve(new Server()), 2000));
    }

    doSomethingRemote() {
        this.connection.then(connection => connection.helloWorld());
    }

}
于 2016-03-27T03:21:08.127 回答
2

最后,我尝试了一系列解决方案,包括装饰器和使用代理对象。

我寻求的解决方案是使用 ES7 async 和 await。经过一番折腾,试图了解它的工作原理和陷阱,设法让它工作。

所以 async 和 await 是我确保对象正确初始化的最有效的解决方案。

我还接受了@torazaburo 的建议(请参阅本页其他地方的答案)并从首先创建然后初始化对象的工厂运行初始化方法。

于 2016-04-04T05:04:42.450 回答