【发布时间】:2018-04-17 16:00:08
【问题描述】:
我知道 SO 上涉及UnhandledPromiseRejectionWarning 的问题的现有答案,但找到的答案似乎都与我的情况不相符。基本上,我以为我知道如何处理承诺。但是这个案例让我发疯了,所以我想在这里寻求一些支持:如何摆脱那个警告?
我正在 NodeJS 中使用以下_write() 实现实现一些可写流:
_write( data, encoding, doneFn ) {
Promise.race( [
this.getSocket(),
new Promise( ( resolve, reject ) => {
setTimeout( reject, 1000, Object.assign( new Error( `timeout on trying to connect w/ ${this.address}` ), { code: "ECONNREFUSED" } ) );
} ),
] )
.then( socket => {
if ( socket ) {
return new Promise( ( resolve, reject ) => {
socket.once( "error", reject );
socket.write( data, encoding, () => {
socket.removeListener( "error", reject );
resolve();
} );
} );
}
} )
.then( doneFn )
.catch( error => {
const { address } = this;
switch ( error.code ) {
case "EPIPE" :
case "ECONNRESET" :
Log( `lost connection w/ ${address.id}` );
break;
case "ECONNREFUSED" :
Log( `failed to connect w/ ${address.id}` );
break;
}
console.log( "error is", error.message );
doneFn( error );
} );
}
当我测试这段代码在超时时正确发出错误时,我得到了神秘的UnhandledPromiseRejectionWarning。
error is timeout on trying to connect w/ /ip4/127.0.0.1/tcp/1
(node:5052) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: timeout on trying to connect w/ /ip4/127.0.0.1/tcp/1
由于_write() 在设计上没有任何承诺,我很确定这个警告是由于这里给出的代码。但我不知道如何摆脱警告。即使明确附加 catch-handler 也不会抑制它。
更新:代码已经过重构和重新测试。尽管如此,仍会记录拒绝警告。我最初使用的是 NodeJS 6.11,但这次是 8.11。
【问题讨论】:
-
如果您重构代码以删除承诺构造函数反模式会发生什么 - 即
new Promise( ( writeResolve, writeReject ) => { -
@JaromandaX 我不明白你的意思。你想让我从代码中删除所有承诺吗?那将不是解决方案,而是一种解决方法。由于使用了对 Promises 的原生支持(没有 bluebird 或类似的),因此没有机会创建没有构造函数模式的 Promises。
-
试试catch all unhandled promises,它会告诉你是哪一行代码在抛出它。
-
不,我只是认为您可以通过删除冗余的 Promise 构造函数来简化代码,该构造函数包装了已经处理 Promise 的代码 - 这是该反模式的问题之一 - 它可能会导致一些事情像这样
-
@JaromandaX 现在我明白了。 ;) 我会试一试的。
标签: javascript node.js promise