如何在node js中将promise转换为回调?

Posted

技术标签:

【中文标题】如何在node js中将promise转换为回调?【英文标题】:How to convert promise into callback in node js? 【发布时间】: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 库? 【参考方案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 绝对是的。我赞成你的回答。应该是被接受的

以上是关于如何在node js中将promise转换为回调?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ES6 中将回调代码转换为 Promise [重复]

把 Node.js 中的回调转换为 Promise

如何在 Node.js 流回调中聚合从异步函数生成的 Promise?

如何在 Node.js 中将字符串转换为字节数组?

在 Node.js 中用 Promise 替换回调

如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌