如何将承诺集成到基于回调的项目中?



我正在做一个主要基于回调的打字项目。现在我正在编写一个类,我必须使用其他方法编写一些新方法。所以我承诺了我需要的方法,并使用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

最新更新