javascript - 解决错误时对socket.write的 promise (nodejs)

标签 javascript node.js sockets error-handling promise

我有问题如何对resolve函数上的 promise 进行send(),如果socket.write()导致错误,则在写操作错误时,nodejs 套接字不会引发异常

虽然我仍然在写套接字时从this.socket.on('error',..)回调中收到通知,但仍然出错,但是仍然无法解决 promise ,因此对send()的调用被卡住了

我想要的是,用户可以只使用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
    }
});

这一项按预期工作,出现错误时, promise 仍将解决
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',)send()

最佳答案

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

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

但是建议监听error事件。

资源:

The writable.write() method writes some data to the stream, and calls the supplied callback once the data has been fully handled. If an error occurs, the callback may or may not be called with the error as its first argument. To reliably detect write errors, add a listener for the 'error' event.



-来自Writable.write() doc

关于javascript - 解决错误时对socket.write的 promise (nodejs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53008515/

相关文章:

javascript - 单击具有不同类名称的另一行时隐藏/显示具有特定类名称的表行? Angular 2

node.js - "npm install"不创建node_modules目录,或者如果存在则不复制.node文件

node.js - NodeJS "crypto"哈希似乎产生与 Crypto-JS javascript 库不同的输出

java - 我如何使用临时端口 1025-5000 解决 WinXP 问题?

javascript - 页面加载后对元素进行一次计数

javascript - uib-popover-template 未显示

javascript - 如何打印json数据。

javascript - 如何在nodeJs + sequelize+graphql中的s3存储桶上上传之前获取文件大小?

.net - 如何模拟强制关闭的 TCP 连接?

python - 尝试使用套接字将值从 GUI 传递到另一个应用程序