javascript - 我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗?
问题描述
这是我的闭包,它创建了一个解析为对象的承诺:
function createConnection(host, port, timeout) {
let latestTransactionId = 0;
let commandResolvers = new Map();
const socket = new WebSocket(`${host}:${port}`);
function newTransactionId() {
latestTransactionId += 1;
return latestTransactionId.toString();
}
function request(body) {
return new Promise(function(resolve, reject) {
const transactionId = newTransactionId();
commandResolvers.set(transactionId, resolve);
socket.send(JSON.stringify({
...body,
trans_id: transactionId
}));
setTimeout(function () {
reject(Error("Command timed out..."));
}, timeout);
});
}
return new Promise(function(resolve, reject) {
socket.onopen = function () {
socket.onmessage = function(event) {
const data = JSON.parse(event.data);
const transactionId = data.trans_id;
const commandResolver = commandResolvers.get(transactionId)
commandResolver(data);
};
connection = {
request: request
}
resolve(connection);
};
setTimeout(function () {
reject(Error("Connection timed out..."));
}, timeout);
});
}
这是我的使用方法:
const connection = await createConnection(host, port, timeout);
我将如何重写对象创建实现以使这种语法成为可能:
const connection = await new Connection(host, port, timeout);
或者也许以下会更好
const connection = await new ConnectionPromise(host, port, timeout);
这有意义吗?我在理解什么时候应该使用闭包来创建对象以及什么时候应该使用原型时仍然存在一些问题。人们似乎也推荐不同的模式,几乎没有实际的优点和缺点,但我更喜欢原型模式,所以更喜欢在这里使用它,这样做是有意义的。
解决方案
你可以让你的构造函数返回一个承诺,..
例如。
class Connection {
constructor () {
this.name = "connection";
return new Promise((resolve) => {
setTimeout(() => {
this.name = "connection made";
resolve(this);
}, 1000);
});
}
}
async function test () {
console.log("Start");
const a = await new Connection();
console.log(a.name);
console.log("End");
}
test();
推荐阅读
- sass - 如何弃用 Sass 纯变量?
- ios - 如何在 danielgindi iOS 图表中创建多个 y 轴折线图?
- selenium - 执行 selenium 脚本后未单击提交按钮
- php - PHP 将文件转换为 JPG
- sql-server - SQL Server 内存优化数据和 FILESTREAM 数据文件非常大
- jdbc - 尝试路由 HTTPS 流量时,SSH 隧道无法与 JDBC 一起使用
- ios - 在 Swift 中按条件使用 dispatchqueue 的最佳方法
- android - (kotlin) editText.toString().toInt() 在 anroid studio 中不起作用
- android - 连接的线程返回空对象
- ruby-on-rails - Rails 5.2 服务器错误 - 完成新手