gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:17:52 24 4
gpt4 key购买 nike

我想要一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com