node.js - 我可以在 NodeJS 中混合使用回调和异步/等待模式吗?

标签 node.js async-await callback

我在互联网上查找了答案,但我找不到真正要找的东西。

我需要知道下面的代码有什么问题(前提是我们应该避免混淆回调和 promise )-

function a(callback){
    (async ()=>{
        try{
           let result = await doSomething();
           callback(null, result);
        } catch(e){
           log('error at await');
           callback(e, null);
        }
    })()
}

如果我在代码中使用上述模式可以吗?

最佳答案

Can I mix callbacks and async/await patterns in NodeJS?

可以。不推荐。

混合回调和 promise 时,通常更难进行正确的错误处理。此外,控制流可能真的是一团糟。这个例子并不太乱,因为只有一个异步操作,但为什么不直接返回一个 promise 并加入异步设计的现代时代并完全跳过使用任何普通回调呢?此外,这里的等待是毫无意义的。您只是让事情变得比 return doSomething() 复杂得多,并且让调用者使用返回的 promise。

因此,您可以用 1 行简单的代码替换 9 行函数体(包括 async IIFE)。

不混合普通回调和 promise 的原因

  1. 首先,所有首先使用 promises 而不是普通回调的原因。我不会重复所有这些,因为它们已经被分析和重复了很多次。引入任何简单的回调只会否定很多最初使用 promises 的原因。
  2. 100% 基于 Promise 的代码通常会比两者的任何混合更紧凑和更简单(一旦您了解 Promise 以及如何最好地编写代码)。
  3. 当您混合使用 promise 和普通回调时,控制流会变得非常复杂。每个人都有一个如何做的模型。一旦你有多个并行或顺序的异步操作,普通回调就会复杂得多(这就是为什么当我们只有普通回调时必须存在诸如 async 库之类的库的原因)而那种级别的流控制是自然的并且内置了 promise 。然后,尝试混合控制流和错误处理这两种模型,事情很快就会变得非常复杂。
  4. 许多开发人员在尝试混合使用两者时在错误处理方面犯了错误,未能正确传播错误。出现这些错误的原因是,当你混音时要正确地做到这一点会更加复杂。
  5. Promises 是 Javascript/nodejs 中异步编程的现在和 future 。我们甚至很快就会有顶级 await 甚至可能基于 promise 的异步导入。为什么要使用不再被视为语言的现在或 future 的旧模型来增加复杂性。
  6. 如果您有一些不返回 promise 的异步操作,那么您可以通过在它们周围放置一个 promise 包装器(可能使用 util.promisify())然后仅使用它们来更恰本地使用它们以他们对您的实际实现和控制流程的 promise 形式。

关于node.js - 我可以在 NodeJS 中混合使用回调和异步/等待模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62037166/

相关文章:

c# - 启动异步方法时 Hook

angularjs - angular $http/jquery 完全等效

javascript - 函数完成后运行代码并获取返回值

javascript - 请求 promise 未处理的拒绝 RequestError : Error: ETIMEDOUT

node.js - MQTT 代理的最大消息长度是多少?

c# - 如何在第一个任务 RanToCompletion 之后等待

html - Paypal 回调未验证

javascript - 如何从 discord.js 中提取消息数据?

node.js - 访问 Mocha 中的 Meteor 设置

JavaScript React async/await 返回错误的主体?