Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗?_Javascript_Closures_Prototype - Fatal编程技术网

Javascript 我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗?

Javascript 我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗?,javascript,closures,prototype,Javascript,Closures,Prototype,下面是我的闭包,它创建了一个解析为对象的承诺: function createConnection(host, port, timeout) { let latestTransactionId = 0; let commandResolvers = new Map(); const socket = new WebSocket(`${host}:${port}`); function newTransactionId() { latestTran

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

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

这有意义吗?我在理解何时应该使用闭包创建对象以及何时应该使用原型时仍然存在一些问题。人们似乎也推荐不同的模式,但实际的优势和劣势都很小,但我更喜欢原型模式,所以我更愿意在这里使用它,因为这样做是有意义的。

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

例如

类连接{
构造函数(){
this.name=“连接”;
返回新承诺((解决)=>{
设置超时(()=>{
this.name=“已建立连接”;
解决(这个问题);
}, 1000);
});
}
}
异步函数测试(){
控制台日志(“启动”);
常数a=等待新连接();
console.log(a.name);
控制台日志(“结束”);
}

test()如果您有多个套接字要侦听,那么这是有意义的。您是否在创建构造函数和原型时遇到问题,或者这不是问题的一部分?关于闭包,它不是闭包和原型之间的选择。你可以根据需要混合搭配,但从你的用词来看,我认为你可能指的是单身?像一个只能创建一个实例的对象?简单来说,闭包只是函数及其使用中数据的包装。因此,在代码中,调用createConnection()将围绕函数createConnection和变量套接字、解析器等后面的数据创建闭包,以便在createFunction()之后仍然可以访问它们已完成运行。您可以尝试在
{request:request}
对象上放置套接字、解析程序和id,并将
request
(以及
newTransactionId
)作为方法。然后使用构造函数创建该对象,并为其提供原型方法。但是不,这不应该改变
createConnection
的性质,它应该是一个简单的函数(或者最多是一个静态方法),返回一个(实例)对象的承诺。谢谢!我穿上试试Monday@Bergi是的,我肯定这不是个好主意。但出于好奇,它是如何影响继承的,。为我执行instanceof返回true,而不是您在链接中提到的false,我还使用
extends
创建了一个子类,Connection&Connection2都为instanceof返回true。同样,使用方法和覆盖似乎也很有效。这是使用Chrome,所以我想知道这是否更像是ES5继承问题?。我能找到的是肯定的,
super
将返回一个承诺,但这不是预期的吗?方法
this
仍然是实例。另外,刚刚使用Babel编译了相同的ES5测试,instanceof再次返回true.:(我确信我遗漏了一些东西,因为根据过去的经验,我知道你知道你的东西:)你能给出一个简单的例子来说明事情的进展情况吗?@Keith我推荐
class Connection{constructor(name){this.name=name;}static create(){return new Promise(resolve=>setTimeout(resolve,1000,“Connection make”)。然后(名称=>新连接(名称));}}