Javascript Promisify节点tls.connect方法

Javascript Promisify节点tls.connect方法,javascript,node.js,promise,Javascript,Node.js,Promise,在成功连接时,使用socket实例解决tls.connect方法的正确方法是什么?我发现这有点棘手,因为似乎没有现成的方法来区分连接时的错误和与TCP服务器通信时的常规错误(连接成功后)。虽然看起来有点臭,但可能是 const connect = (port, host, options) => { /** * Some workaround to be able * to distinguish between error on connection * and e

在成功连接时,使用
socket
实例解决
tls.connect
方法的正确方法是什么?我发现这有点棘手,因为似乎没有现成的方法来区分连接时的错误和与TCP服务器通信时的常规错误(连接成功后)。虽然看起来有点臭,但可能是

const connect = (port, host, options) => {
  /**
   * Some workaround to be able
   * to distinguish between error on connection
   * and error after connection was established successfully
   */
  let connected = false

  return new Promise((resolve, reject) => {
    const socket = tls.connect(port, host, options, () => {
      connected = true
      return resolve(socket)
    })

    socket.on('data', (data) => {...})
    socket.on('end', () => {...})
    socket.on('disconnect', () => {...})
    socket.on('error', (err) => {
       if (!connected) {
         return reject(err)
       }
       console.error(err)
    })
  })
}

立即返回套接字并向套接字添加一个
connected
promise,这样您就可以同步附加其他处理程序,并且仍然可以侦听带有promise的连接:

const connect = (port, host, options) => {
  let resolve, reject;
  var connected = new Promise((res, rej) => { resolve = res; reject = rej; });
  const socket = tls.connect(port, host, options, resolve);
  socket.connected = connected;
  socket.on('error', reject); // it's fine to calll reject/resolve several times
  return socket;
};  

立即返回套接字并向套接字添加一个
connected
promise,这样您就可以同步附加其他处理程序,并且仍然可以侦听带有promise的连接:

const connect = (port, host, options) => {
  let resolve, reject;
  var connected = new Promise((res, rej) => { resolve = res; reject = rej; });
  const socket = tls.connect(port, host, options, resolve);
  socket.connected = connected;
  socket.on('error', reject); // it's fine to calll reject/resolve several times
  return socket;
};  

这到底是怎么回事?im的目的是在应用程序即将启动时连接一次,并在初始连接后重新使用同一个套接字。假设应用程序启动并使用套接字对象连接解析。在您的示例中,当读取/写入套接字时发生错误,例如2小时后会发生什么,当调用此行时会发生什么
socket.on('error',reject)
绝对没有,承诺只针对连接而不是内容。这到底是如何工作的?im的目的是在应用程序即将启动时连接一次,并在初始连接后重新使用同一个套接字。假设应用程序启动并使用套接字对象连接解析。在您的示例中,如果读取/写入套接字时出现错误,2小时后会发生什么,调用此行时会发生什么
socket.on('error',reject)
绝对没有什么,承诺只针对连接,而不是内容。