我对如何resolve
对send()
函数的承诺有疑问,如果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()
调用
答案 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()方法将一些数据写入流,并在数据被完全处理后调用提供的回调。如果发生错误,则可能会或可能不会以该错误作为其第一个参数来调用该回调。为了可靠地检测到写错误,请为“错误”事件添加一个侦听器。