我正在做一个主要基于回调的打字项目。现在我正在编写一个类,我必须使用其他方法编写一些新方法。所以我承诺了我需要的方法,并使用try/catch + async/await来编写方法。但是我写的方法仍然以回调作为参数,并且它们返回的承诺解析为void,以便能够被项目的其余部分使用。
我认为更好的是尝试使这些新方法与回调和承诺兼容,即通过调用回调,如果它被传递,但也返回的东西,将被传递到回调,以便他们可以在未来的任何一种方式使用,作为一个基于回调函数或承诺链/async等待的一部分。
我对类型注释中的返回类型应该是什么感到困惑。假设该方法正在从数据库中获取一个用户。我不想抛出这个方法,因为它周围的项目是基于(err, data)
回调结构,所以抛出的错误不会被捕获。我需要返回一些东西,但我不确定类型注释。说返回类型是User | Error
似乎是错误的?那么调用函数就必须检查在运行时返回的类型,对吧?
如何在不抛出错误的情况下处理错误?
你熟悉被拒绝的承诺吗?
从Promise API处理错误的惯用方法是使用Promise reject,这样你返回的Promise要么用User完成,要么用Error拒绝。这使得错误通过承诺链传播try/catch样式。与回调风格函数中使用err
调用回调的方式相同,您可以从async
函数或then
处理程序中调用return Promise.reject(err)
(docs)或throw err
;他们之间没有多大差别。
就TypeScript而言,你不能也不应该在返回值中特别键入Error:它假设所有的Promises都可能被拒绝,并且拒绝原因可能是any
类型。我相信这是习惯的拒绝原因是一个错误,但很像JavaScript中的throw
语句,它可以很容易地是一个字符串或数字。
参见:
- 如何将现有的回调API转换为承诺?
- 跑龙套。NodeJS中的promise