代码之家  ›  专栏  ›  技术社区  ›  uray

解析套接字上的承诺。出错时写入(nodejs)

  •  0
  • uray  · 技术社区  · 7 年前

    我不知道如何 resolve 上的承诺 send() 函数,如果 socket.write() 导致错误,nodejs 套接字不引发异常 写入操作出错时

    而我还是接到了 this.socket.on('error',..) 回调如果在我写入套接字时出错,但仍然无法解析承诺,因此调用 被卡住了

    我想要的是,用户只需使用 send().then((result) => {}) ,如果有错误,他们可以在 result 论点

    socket.on('error',(err) => {
        console.error(err); //if there are error this will be called
    });
    
    async send(data){
        return new Promise(resolve, () => {
            try{
                socket.write(data, 'binary',() => {
                    resolve(true); //data sent, resolve the promise
                });
            }
            catch(e){ //nodejs socket.write does not throw exception
                resolve(false);
            }
        })
    }
    
    //call send, and wait for results
    send({..}).then((result) => {
        if(result === true){
             //send success
        }
        else {
             //send failed
        }
    });
    

    这一个按预期工作,当出现错误时,承诺仍然解决

    async send(data){
        return new Promise(resolve, () => {
            try{
                let errorHandler = (err) => {
                    resolve(false);
                }
                socket.once('error', errorHandler);
                socket.write(data, 'binary',() => {
                    socket.off('error', errorHandler);
                    resolve(true); //data sent, resolve the promise
                });
            }
            catch(e){ //nodejs socket.write does not throw exception
                resolve(false);
            }
        })
    }
    

    但是 有没有更好的解决方案? ,因为我不想创建匿名函数并调用 on('error',) off('error',) 每次 发送() 已调用函数

    1 回复  |  直到 7 年前
        1
  •  0
  •   tbking    7 年前

    您可以检查 error 传入的参数 socket.write 回调。

            socket.write(data, 'binary',(err) => {
                if (err) return reject err;
                resolve(true); //data sent, resolve the promise
            });
    

    但建议您继续收听 错误 事件

    资料来源:

    可写的。write()方法将一些数据写入流,并在完全处理数据后调用提供的回调。如果发生错误,可以调用回调,也可以不调用回调,并将错误作为其第一个参数。要可靠地检测写入错误,请为“错误”事件添加侦听器。

    --发件人 Writable.write() doc

    推荐文章