【问题标题】:How to make for loop in node.js and mongoDB run synchronously如何使node.js和mongoDB中的for循环同步运行
【发布时间】:2018-05-11 10:06:01
【问题描述】:

这是我第一次使用 Node.js,但遇到了问题。

我从 API 获取一些数据,并将它们存储在一个数组中。

然后,我正在做一些 MongoDB 的查询,以了解我在该数组上的数据是否在数据库中。

我想为每次出现的数组使用一个 for 循环,但是当我尝试调用 MongoDB 时,for 循环会立即增加计数器,而无需等待查询结束和相关响应,并且我只获取数据最后一次出现(重复)。

我的代码有一部分,因此我总是在最后一次出现时得到控制台相关的“结果”(例如,如果我期望像“1、2、3、4、5”这样的东西,我有'5 5 5 5 5')

如何确保 for 循环以正确的方式工作?

感谢您的帮助。

for ( counter = 0; counter < array.lenght; counter ++) {

    MongoClient.connect(url, function (err, db) {

       var query = { name: array[counter] };

       db.collection("collectionName").find(query).toArray(function (err, result) {

           // Check if 'query' value exist in the database, if yes do some stuff, otherwise do others stuff
           console.log(result); 


    }
)

编辑:只是为了让大家知道,代码终于可以工作了。 谢谢你的帮助。

【问题讨论】:

  • 您尝试过使用await 关键字了吗?
  • 按照@UghThatGuyAgain 的建议检查async / await
  • 但是,循环中的await 并不总是正确的:请确保您确实想要强制顺序执行。通常,当在循环语句中时,各个步骤彼此独立。如果它是可并行化的,则创建一个promsies数组和await Promise.all(...)

标签: javascript node.js mongodb for-loop


【解决方案1】:

尝试运行以下代码。让我知道它是否有效。

let fun = async function () {
    for (var counter = 0; counter < array.length; counter++) {
        await MongoClient.connect(url, function (err, db) {
            var query = { name: array[counter] };
            db.collection("collectionName").find(query).toArray(function (err, result) {
                // Check if 'query' value exist in the database, if yes do some stuff, otherwise do others stuff
                console.log(result);
            })
        })
    }
}

fun();

【讨论】:

  • 大家好,感谢您的帮助。它不起作用,问题总是一样的,for循环保持增加计数器变量而不等待Mongo的查询的答案。
  • 我尝试了你的更新,但它不起作用,问题总是一样的。无论如何感谢您的帮助。
  • 已经做到了,我得到了相对于 db.collection 的“SyntaxError: Unexpected identifier”
  • 即使我将for循环放入连接,结果总是一样的。它总是在控制台上显示相对于数组最后一项的查询结果。
【解决方案2】:

问题是异步执行一直等到 for 结束才开始使用异步方法,此时计数器具有所有执行的最大值。 一种解决方案是将 for 的所有内容放在不同的函数中,并使用所需的参数调用它。这样你就可以创建一个新的闭包并保留变量的值。

var doSomething = function(loopValue) {
    MongoClient.connect(url, function (err, db) {
        var query = { name: loopValue };
        db.collection("collectionName").find(query).toArray(function (err, result) {
            // Check if 'query' value exist in the database, if yes do some stuff, otherwise do others stuff
            console.log(result); 
        }
    }
}

for (let counter = 0; counter < array.length; counter ++) {
    doSomething(array[counter]);
)

【讨论】:

  • 您好,感谢您的评论。你能解释一下吗?我理解这个概念,但我想确定我应该为此做些什么..
  • 我用代码示例编辑了答案。也许您需要传递其他参数,但这取决于上下文。希望对你有帮助
  • 它不起作用,但无论如何感谢您的帮助;-)
  • 我没有收到任何错误,因为代码写得很好。我总是得到数组最后一项的结果(如果 array.lenght 为 5,我得到数组 [5] 答案的五倍)
  • 这 2 件事对我有用: - 长度 => 长度 - for ( counter => for ( let counter
猜你喜欢
  • 2016-01-24
  • 2014-02-06
  • 2015-04-11
  • 2019-01-18
  • 1970-01-01
  • 2011-11-08
  • 2018-04-18
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多