【问题标题】:How to convert promise into callback in node js?如何在node js中将promise转换为回调?
【发布时间】:2017-03-31 03:39:45
【问题描述】:

这是一个简单的场景..

我想将 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 库?

标签: node.js firebase callback promise firebase-authentication


【解决方案1】:

如果你想在一个 Promise 上使用节点风格的回调,像这样调用它们:

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

一些 Promise 库也为此提供了帮助函数,例如 Bluebirds .asCallback(callback)

【讨论】:

  • 如果回调在成功函数中抛出你将有一个未处理的拒绝 - 这不是你所期望的 - 你需要尝试/捕获错误并在承诺之外 throw 它回调抛出时的上下文。
  • @BenjaminGruenbaum 实际上,如果回调抛出(它永远不应该),我会预期未处理的拒绝,但是是的,我们可以在 then 之后添加 .catch(process.emit.bind(process, "uncaughtException"))
【解决方案2】:

在 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);

请注意,它接收一个函数,该函数返回一个promise,而不是promise 本身,它返回一个函数,该函数接收一个回调,但它本身不接收回调。

【讨论】:

    【解决方案3】:

    这很简单:

    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){...}

    【讨论】:

    • 不要那样做。如果cb抛出,会再次调用。
    • @Bergi 有自己的错误,这不应该产生任何递归,但您的解决方案更干净。
    • 不,不是递归,但对于预计只调用一次的回调来说仍然存在问题。
    • @Bergi 绝对是的。我赞成你的回答。应该是被接受的
    猜你喜欢
    • 2015-12-11
    • 2018-04-23
    • 2016-08-11
    • 2018-09-19
    • 2017-03-22
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多