【发布时间】:2018-10-09 09:28:49
【问题描述】:
我在nodejs中有一个函数,它的指令必须按顺序执行。我已经尝试了节点 8 和承诺的本机选项(异步和等待)。我不能让他在返回之前等待 FindOne 结果。
module.existe = function(usr, pass) {
(async() => {
await coleccion.findOne(
{ usr: usr, pass: pass },
(err, result) => {
return (result == null)? false : true;
}
);
})();
}
对mongo的查询很好,我可以恢复文档,但总是在返回后,所以验证不起作用。这个函数应该做的是检查一个集合 {usr, key} 是否已经存在于数据库中
可能是什么?
【问题讨论】:
-
coleccion.findOne 是类型 (
, >)->(undefined),你不能等待 undefined。您需要一个 ( )->( ) 类型的函数,以便您可以等待结果。您可以使用 util.promisify 进行转换。所以 coleccion.findOneAsync = promisify(coleccion.findOne); const result = await coleccion.findOneAsync({usr, pass}); -
这基本上是How do I return the response from an asynchronous call 的复制品。您不能直接返回它,因为该函数将在结果可用之前返回。因此,您要么返回承诺,要么使用回调。这两种机制之一可用于返回结果。在函数返回之前,Javascript 不会“等待”异步值。即使
async和await也不会为你做这些。 -
非常感谢@jfriend00 答案在您引用的链接中。没有办法工作,因为我有一个概念错误。而不是等待函数的返回,我必须等待回调。非常感谢!
标签: node.js asynchronous busy-waiting