javascript-如何promisify node.js net.connect(与蓝鸟)?

我想要一个Promise版本的node.js函数net.connect.如果连接成功,则应使用套接字解决Promise,如果存在连接错误,则应以错误拒绝,并且最好也可以取消,取消将停止连接尝试.

我自己进行了快速尝试,但尚未实施取消:

function connectAsync() {
    var connect_args = arguments;
    return new Promise(function (resolve, reject) {
        var socket = net.connect.apply(this, connect_args);
        socket.once('connect', function () {
            socket.removeListener('error', reject);
            resolve(socket);
        });
        socket.once('error', function (err) {
            socket.removeListener('connection', resolve);
            reject(err);
        });
    });
}

但是,对于这样简单的事情,这似乎非常复杂.有没有更好的办法?有人已经这样做了吗?

解决方法:

您可以删除两条removeListener()行.承诺只能被解决或拒绝一次,因此您不必担心事件再次被调用.一旦兑现,诺言就不会改变它的状态.

而且,我认为您需要解决几个问题:

> var connect_args =参数可能不起作用,因为参数是临时对象的一种时髦类型.通常的解决方法是复制其内容:var connect_args = [] .slice.call(arguments);.
>在这一行net.connect.apply(this,connect_args);中,我认为这不是正确的值,因为此时您位于promise回调中(也许在这种情况下无关紧要) ).使用net.connect.apply(net,connect_args)在技术上可能更正确.这将更直接地模拟调用net.connect(args).

至于完全使用诺言的智慧,您似乎在评论中对此事有两种看法.

除了删除removeListener()代码行之外,我认为没有太多方法可以简化此过程.您正在创建一个对两个不同的自定义条件做出响应的承诺,因此您必须编写代码以检测这两个条件.没办法解决.

附言如果不删除代码行的removeListener(),则可能会发生错误,因为您正在为’connect’设置事件,但正在执行removeListener(‘connection).另外,我不知道为什么要向removeListener()传递函数,因为它与建立事件处理程序时使用的函数引用不同.

上一篇:bluebird


下一篇:javascript-蓝鸟承诺取消