微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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()传递函数,因为它与建立事件处理程序时使用的函数引用不同.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐