javascript - 如何 promise node.js net.connect(使用 bluebird)?

标签 javascript node.js promise bluebird

我想要一个 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);
        });
    });
}

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

最佳答案

总而言之,如果您直接看 - EventEmitters 是一个非常复杂的抽象。

Promise 表示排序操作 - 将它们视为赋值运算符或分号。常规同步编程中的代码类似于:

try{
    var value = foo(bar);
    log(value);
} catch(e){
    // handle error
}

事情一个接一个地进行:

  1. Enter the try block
  2. Run foo with argument bar
  3. Log the value unless there was an error
  4. If there was an error, handle it.

它就像一个长单链操作。一个 promise 就像这样:

 fooAsync(bar).
 then(log).
 catch(function(){
      // handle error
 });

promise 是一条链。您可以创建多个这样的链,这类似于表示执行一系列操作的其他形式的并发(如线程)。它看起来像下面这样:

--------------------------------+-Success------------------>

                   --Error---->// might join up

另一方面 - 事件发射器不能保证它触发的事件的名称或类型, Node EventEmitter 有一些很酷的特性(比如堆栈跟踪和 error 事件)但是是一个比 promises 弱得多的约定——不同的事件发射器触发不同的事件,一个事件发射器可以做这样的事情:

----Foo fired-+-Handler 1    ---- Bar fired-+      ---- Baz Fired-+-Handler 1

              --Handler 2                                         --Handler 2

它不是一个单一的链——所以虽然已经有一些关于这个的尝试和讨论——没有通用的方法来表示来自事件发射器的 promise ——它们在事件处理和事件名称上太不同了。

另一方面 - pg.connect 采用 Node 样式错误回调。因此很容易做出 promise ,这些都非常明确并遵守契约(Contract)。

您拥有的很好,您可以将其概括为具有两个事件的事件发射器。请记住,您编写这种样板一次,然后在您的所有代码中使用它:)

关于javascript - 如何 promise node.js net.connect(使用 bluebird)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448186/

相关文章:

javascript - AWS Node.js JSON 输入错误

javascript - 如何在 then 语句中返回一组 promise

javascript - 如何按数字和字符排序

javascript - 将 MouseHover 事件更改为 Tooltip 的 Onclick 事件

node.js - 用于获取 Reddit 帐户子 Reddit 的端点

Node.js 响应带有 token ,然后 res.render 或重定向

javascript - 为什么这个 promise 链会立即解决?

javascript - 返回用于点击处理程序的 promise

javascript - 需要使用 HTML 和 CSS 的 flex 垂直线

javascript - 如何为外部和内部元素添加不同的事件处理程序?