首页 > 解决方案 > 为什么使用 Promises 时不保留对象状态?

问题描述

考虑以下代码片段:

class ClientWrapper {
    private client: Client;

    constructor() {
        this.client = new Client();
    }

    async connect() : Promise<void> {
        return this.client.connect();
    }

    async isConnected(): Promise<boolean> {
        return this.client.isConnected();
    }
};

class Client {
    private data?: string;

    private connected: boolean;

    constructor() {
        this.connected = false;
    }

    isConnected(): boolean {
        return this.connected;
    }
    
    async connect() : Promise<void> {
        this.data = 'data';
        const res = await this.executeRequest();
        this.connected = true;
    }

    async executeRequest() : Promise<string> {
        return await Promise.resolve(this.data!);
    }
};

let wrapper = new ClientWrapper();
(async () => {
    await wrapper.connect();
    console.log(await wrapper.isConnected());
})();

执行时,第 48 行 ( console.log(await wrapper.isConnected())) 打印true

现在,我将ClientWrapper connect()方法修改为:

async connect() : Promise<void> {
    this.client.connect();
}

, 删除return.

现在,第 48 行打印false.

为什么connected类的属性Client不保留true价值?既然connect方法返回了,那语句Promise<void>为什么重要呢?return

谢谢!

标签: javascripttypescriptasync-awaitpromisees6-promise

解决方案


这里的问题是您在Client.connect()没有await. 因此,异步函数Clinet.connect()在函数ClientWrapper.connect()已经结束时执行。添加await到调用:

await this.client.connect();

然后它将按预期工作


推荐阅读