首页 > 解决方案 > 我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗?

问题描述

这是我的闭包,它创建了一个解析为对象的承诺:

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);

这有意义吗?我在理解什么时候应该使用闭包来创建对象以及什么时候应该使用原型时仍然存在一些问题。人们似乎也推荐不同的模式,几乎没有实际的优点和缺点,但我更喜欢原型模式,所以更喜欢在这里使用它,这样做是有意义的。

标签: javascriptclosuresprototype

解决方案


你可以让你的构造函数返回一个承诺,..

例如。

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();


推荐阅读