为什么这个诺言被拒绝了?

时间:2019-07-13 02:23:14

标签: javascript node.js typescript

我最近遇到了一个错误,导致我尝试了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>;

这是否意味着输入不正确?

2 个答案:

答案 0 :(得分:2)

  

所以我的问题是:为什么仍然用空的catch块引发错误?

将未定义的内容传递到.catch中实际上无法处理拒绝。

第二个示例unhandledpromiserejection的日志使您感到无法正确处理拒绝。

TypeScript中的定义很好。为什么?请参考official ECMAScript spec

  

当使用参数onRejected调用catch方法时,将执行以下步骤:

     
      
  1. 让诺就是这个价值。
  2.   
  3. 返回?调用(承诺,“然后”,«未定义,onRejected»)。
  4.   

正弦.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

参考: