解决错误时对socket.write的承诺(nodejs)

时间:2018-10-26 12:13:51

标签: javascript node.js sockets error-handling promise

我对如何resolvesend()函数的承诺有疑问,如果socket.write()导致错误,写操作时nodejs socket不会抛出异常是错误的

虽然我在向套接字写入数据时仍然发生错误,但仍从this.socket.on('error',..)回调中得到通知,但仍然无法解决诺言,因此对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
    }
});

这一项工作正常,出现错误时,承诺仍将解决

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()调用

1 个答案:

答案 0 :(得分:0)

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

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

但是建议收听error事件。

来源:

  

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

-来自Writable.write() doc