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

问题描述 投票:1回答:1

我在互联网上寻找答案,但找不到真正的答案。

我需要知道以下代码有什么问题(前提是我们应避免混合使用回调和Promise)-

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

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

node.js async-await callback
1个回答
0
投票

UPDATE

[好吧,基本上,我们正在尽最大努力避免出现“回调地狱”,因此请记住,我们需要重新思考在ES6 +中处理回调的方式。

[下面,我们通过返回对rap()的调用的输出,从传递给something.start()的回调中返回承诺。

这有意义吗? :)

rap = (fn, arg) => {
  return new Promise((resolve, reject) => {
    fn(arg, (e,r) => {
      if(e) return reject(e) else return resolve(r)
    })
  })
}

const sink = async (_config) => {
  await something.start('some stuff',(t) => {
    return rap(someData, someMore)
    .then( (r) => {
      t.ok(r); //or w/e
      return null
    }).catch( err => throw new Error(err))
  })
  //do stuff
  something.end()
  return null
}

原始

此:

function fetchFirstUser(callback) {
  knex.first().from("users").then((user) => {
    callback(null, user);
  }, callback);
  // you could add a .catch(console.log) to see why it fails
}

it("should pass us a null if there are no users", function(done) {
  fetchFirstUser(function(err, user) {
    expect(err).to.be.null;
    expect(user).to.be.null;
    done();
  });
});

成为:

it("should pass us a null if there are no users", async () => {
  const user = await knex.first().from('users');
  expect(user).to.be.null;
});

基本上是评论中所说的,但相反。大声笑

参考:Please Mix Promises and Callbacks


0
投票

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

您可以。不推荐。

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

因此,您可以用1条简单的行替换9条功能主体行(包括async IIFE)。

不要混用简单的回调和承诺

  1. 首先,首先在纯回调中使用promise的所有原因。我不会重复所有这些内容,因为它们已经过分析并多次重复。引入任何简单的回调只会否定许多使用诺言的原因。
  2. [100%基于承诺的代码通常比两者的任何组合都更紧凑,更简单(您所知道的一个)。
  3. 当混合promise和简单的回调时,控制流变得非常复杂。每个人都有一个如何做的模型。只要您执行多个并行或顺序的异步操作,普通回调就会变得更加复杂(这就是为什么当我们只有普通回调时必须存在诸如async库之类的库的原因),而这种级别的流控制是自然而然的,兑现承诺。然后,尝试将控制和错误处理流程的两个模型混合在一起,事情很快就会变得很复杂。
  4. [许多开发人员在尝试解决这两个问题时会在错误处理方面犯错误,无法正确传播错误。这些错误的原因是,正确混合后,做起来会更加复杂。
© www.soinside.com 2019 - 2024. All rights reserved.