javascript - 为什么使用 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
谢谢!
解决方案
这里的问题是您在Client.connect()
没有await
. 因此,异步函数Clinet.connect()
在函数ClientWrapper.connect()
已经结束时执行。添加await
到调用:
await this.client.connect();
然后它将按预期工作
推荐阅读
- jquery - 如何将光标聚焦在评论框中的第一行?
- streaming - 何时在黑暗中使用轮询和流式传输
- mongodb - 什么是稀疏?MongoDB中稀疏的目的是什么?
- python - 使用 XPath 和 Scrapy 从下一个节点的子节点中提取文本
- python - selenium with IE:点击按钮下载文件,再点击其他按钮,进程会卡住
- python - 如何验证来自原始 HTML 表单的发布请求(未使用 django 表单)
- java - 使用正则表达式屏蔽以下格式
- azure-application-insights - 是否可以在应用程序洞察力中获得 customDimensions["--"] 动态属性?我们可以在 kusto 查询中编写循环吗
- python - ubuntu 上 Python Anaconda 安装问题
- c++ - MacOS 上的 C++:显示日期和时间问题