如何在Node.js中将Promise转换为回调函数?

5

以下是一个简单的场景:

我想将 Firebase 文档中给出的代码转换为我的 API,该如何将其转换为回调函数?

var uid = "some-uid";

admin.auth().createCustomToken(uid)
  .then(function(customToken) {
    // Send token back to client
  })
  .catch(function(error) {
      console.log("Error creating custom token:", error);
  });

这是文档的链接。
https://firebase.google.com/docs/auth/admin/create-custom-tokens 

不要!拥抱Promise吧! - Bergi
你使用的是哪个 Promise 库? - Bergi
3个回答

12

如果你想在 Promise 中使用类似 Node 风格的回调函数,可以像这样调用它们:

.then(function(result) {
    callback(null, result);
}, function(error) {
    callback(error);
});

一些Promise库也有帮助函数,例如Bluebird的.asCallback(callback)


2
如果回调函数在成功函数中抛出异常,你将会得到一个未处理的拒绝 - 这不是你期望的结果 - 你需要尝试捕获错误并在 promise 上下文之外 throw 它。 - Benjamin Gruenbaum
2
@BenjaminGruenbaum 实际上,如果回调函数抛出异常(它永远不应该这样做),我会期望未处理的拒绝,但是是的,我们可以在then之后添加.catch(process.emit.bind(process, "uncaughtException")) - Bergi

8
在 NodeJS > 8.2 中,你可以使用 require('util').callbackify()(与 require('util').promisify() 相反):
const { callbackify } = require('util');

callbackify(() => admin.auth().createCustomToken(uid))((err, customToken) => {
  // ...
});

或者如果你从其他地方有一个回调:

const { callbackify } = require('util');

callbackify(() => promise)(callback);

请注意,它接收一个返回承诺的函数而不是承诺本身,并返回一个接收回调函数而不是接收回调函数本身的函数。

-1

这很简单:

function(uid, cb){
  admin.auth().createCustomToken(uid)
  .then(function(customToken) {
    cb(null, customToken);
  })
  .catch(function(error) {
      console.log("Error creating custom token:", error);
      cb(error, null);
  });
}

其中cb类似于function callback(error, token){...}


4
不要那样做。如果 cb 抛出异常,它会再次被调用。 - Bergi
@Bergi 自带错误,但这不应该创建任何递归,但您的解决方案更干净。 - bknights
不是递归,但对于预期仅被调用一次的回调仍然存在问题。 - Bergi
@Bergi 是的,绝对正确。我已经为你的答案点赞了。它应该被接受。 - bknights

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接