如何在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 [重复]