我最近遇到了一个错误,导致我尝试了Promise,并发现了我无法弄清的东西。
我已经在Node v11.9和Google Chromes控制台中对此进行了测试。
此示例显示了我在说什么:
Promise.reject("I dont throw").catch(console.log)
Promise.reject('I throw').catch().catch(e => console.log(e))
如您所见,第二个捕获是记录错误的捕获。
我必须包括第二个catch()
块才能使此代码段记录错误,但是以下示例可以在产生拒绝承诺的浏览器中运行:
Promise.reject("I dont throw").catch(console.log)
// -> Logs "I don't throw"
Promise.reject('I throw').catch()
// -> UnhandledPromiseRejectionWarning:
所以我的问题是:为什么仍然用空的catch块引发错误?
我认为这是因为没有回调,并且内部有一些检查会跳过未定义的catch回调,并继续在链上到达另一个catch块,或者在这种情况下是未处理的拒绝。
但是如果是这种情况,为什么VSCodes Typescript类型的.catch()
列为:
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
这是否意味着输入不正确?
答案 0 :(得分:2)
所以我的问题是:为什么仍然用空的catch块引发错误?
将未定义的内容传递到.catch
中实际上无法处理拒绝。
第二个示例unhandledpromiserejection
的日志使您感到无法正确处理拒绝。
TypeScript中的定义很好。为什么?请参考official ECMAScript spec:
当使用参数onRejected调用catch方法时,将执行以下步骤:
- 让诺就是这个价值。
- 返回?调用(承诺,“然后”,«未定义,onRejected»)。
正弦.then
可以这样称呼:
p.then(onResoled); // just handle resolution, here onRejected is undefined
将handler
中的参数.catch(handler)
设为可选,不会违反任何内容。
答案 1 :(得分:1)
catch
需要一个函数指针/删除/ lambda
Promise.reject("I dont throw").catch(console.log)
Promise.reject('I throw').catch().catch(e => console.log(e))
在第二个Promise中,您正在捕获由Promise的第一个catch引发的错误。
Promise.reject('I throw')
.catch() //This throws an error (Undefined, etc)
.catch(e => console.log(e)) //this catches that error thrown
如果您想捕捉并忽略它,
Promise.reject('I throw')
.catch((error) => { /*Just Ignore*/ }) //Just Add an empty function
参考: