gpt4 book ai didi

javascript - 尽管尽可能地捕获拒绝,但仍收到 UnhandledPromiseRejectionWarning

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:31 26 4
gpt4 key购买 nike

我知道涉及 SO 上的 UnhandledPromiseRejectionWarning 问题的现有答案,但找到的答案似乎都与我的情况不充分匹配。基本上,我以为我知道如何处理 promise 。但这个案例让我抓狂,所以我想在这里请求一些支持:如何消除该警告?

我正在 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() 在设计上没有 promise ,所以我很确定这个警告是由于此处给出的代码造成的。但我不知道如何摆脱警告。即使显式附加 catch-handler 也不会抑制它。

更新:代码已被重构并重新测试。尽管如此,还是会记录拒绝警告。我最初使用的是 NodeJS 6.11,但这次是 8.11。

最佳答案

看起来流实现存在 Promise.race() 问题。

我尝试将代码分解为基本模式:

function someHandler( doneFn ) {
const toBeResolvedLate = new Promise( ( resolve, reject ) => {
setTimeout( resolve, 5000 );
} );
const toBeRejectedEarly = new Promise( ( resolve, reject ) => {
setTimeout( reject, 1000, new Error( "timeout" ) );
} );

Promise.race( [
toBeRejectedEarly,
toBeResolvedLate,
] )
.then( doneFn )
.catch( error => {
doneFn( error );
} );
}


someHandler( ( ...args ) => {
console.log( "directly:", args );
} );


const { Writable } = require( "stream" );

const stream = new Writable( {
write: function( a, b, done ) {
someHandler( ( ...args ) => {
console.log( "in _write:", args );
done( ...args );
} );
},
} );

stream.write( Buffer.from( "chunk" ) );

结果我得到了这个:

directly: [ Error: timeout
at Promise (...\scratch_2.es6:6:30)
at new Promise (<anonymous>)
at someHandler (...\scratch_2.es6:5:29)
at Object.<anonymous> (...\scratch_2.es6:20:2)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10) ]
in _write: [ Error: timeout
at Promise (...\scratch_2.es6:6:30)
at new Promise (<anonymous>)
at someHandler (...\scratch_2.es6:5:29)
at Writable.write [as _write] (...\scratch_2.es6:29:4)
at doWrite (_stream_writable.js:397:12)
at writeOrBuffer (_stream_writable.js:383:5)
at Writable.write (_stream_writable.js:290:11)
at Object.<anonymous> (...\scratch_2.es6:36:9)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10) ]
(node:3288) UnhandledPromiseRejectionWarning: Error: timeout
at Promise (...\scratch_2.es6:6:30)
at new Promise (<anonymous>)
at someHandler (...\scratch_2.es6:5:29)
at Writable.write [as _write] (...\scratch_2.es6:29:4)
at doWrite (_stream_writable.js:397:12)
at writeOrBuffer (_stream_writable.js:383:5)
at Writable.write (_stream_writable.js:290:11)
at Object.<anonymous> (...\scratch_2.es6:36:9)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
(node:3288) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:3288) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

如果我省略了尝试写入 block 的最后一行代码,则第二个堆栈跟踪以及UnhandledPromiseRejectionWarning-东西都会消失。

关于javascript - 尽管尽可能地捕获拒绝,但仍收到 UnhandledPromiseRejectionWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49871358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com