2016-12-17 60 views
1

什么是正确的promisifying方法tls.connect方法,它应该解决与socket实例上成功connect.I发现它有点棘手,因为它似乎没有出路该框用于区分连接时的错误和与TCP服务器通信期间的常规错误(连接成功后)。虽然看起来有点臭也可能是像promisify节点tls.connect方法

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) 
    }) 
    }) 
} 

回答

0

返回插座立即添加connected承诺插座代替 - 这样你可以同步附加其他处理程序,并依然能听到并承诺连接:

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; 
}; 
+0

这是如何工作的?我们所要做的就是在应用即将启动时连接一次,并在初始连接后重新使用相同的套接字。可以说,应用程序启动并连接解决与套接字对象。在你的例子中,如果在读/写socket的过程中出现错误时,会发生什么后会发生2小时或什么,当调用这行时会发生什么'socket.on('error',reject)' – Srle

+0

绝对没有,承诺只是为了连接而不是内容。 –