【问题标题】:execution sequential in node [duplicate]节点中的执行顺序[重复]
【发布时间】: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 不会“等待”异步值。即使asyncawait 也不会为你做这些。
  • 非常感谢@jfriend00 答案在您引用的链接中。没有办法工作,因为我有一个概念错误。而不是等待函数的返回,我必须等待回调。非常感谢!

标签: node.js asynchronous busy-waiting


【解决方案1】:

generalhenry已经在cmets中回答了

完全制作它们:

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

module.existe = function (usr, pass) {
    const findOnePromise = promisify(coleccion.findOne);

    (async () => {
        const result = await findOnePromise({ usr: usr, pass: pass });
        return (result === null) ? false : true;
    })();
}

文档:await - util.promisify

【讨论】:

  • 这并不能解决任何问题。而且,findOne() 已经有一个承诺接口,所以没有理由承诺它。看看这个问题被标记为什么。问题是您不能让 Javascript 在函数返回之前等待异步值。你就是不能。因此,您必须使用回调或承诺,并使用它们来传达异步结果。 Mongodb 的.findOne() 已经有一个promise 接口 - 不需要创建一个新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多