2016-12-17 1 views
1

成功したconnect.Iでsocketインスタンスで解決する必要がある方法で、tls.connectメソッドを約束する正しい方法は何でしょうか?少し難解です接続中のエラーと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

これはどういう仕組みですか?アプリケーションが起動しようとしているときに1回だけ接続し、最初の接続後に同じソケットを再利用するのは何ですか?アプリケーションの開始と接続がソケットオブジェクトで解決されると言うことができます。あなたの例では、ソケットに読み込み/書き込み中にエラーが発生した場合に何が起きるか2時間後に何が起こるのか、この行が 'socket.on( 'error'、reject)' – Srle

+0

と呼ばれるとどうなりますか?約束はコンテンツの接続ではなく、コンテンツのためのものです。 –

関連する問題