带有mongoDB调用/ node.js的Foreach循环

时间:2018-04-27 16:41:21

标签: node.js mongodb asynchronous

  result.forEach(element => {
    //Get each element
    console.log("LOOP");
    dbo.collection("users").findOne({email: emailGiven, "friends.email": element.email},function(errT, resultT) {
      if (errT){
        console.log("Query Error Inside!");
        res.status(errT.status); // or use err.statusCode instead 
        console.log(errT);
        //db.close();
        //return res.send(errT.message);
      }
      else {
        if (resultT) {
          var oneUser = {
            email: element.email,
            username: element.username,
            fullName: element.fullName,
            status: resultT
          };
          //console.log(resultT);
          foundUsers.push(oneUser);
        } else {
          //Not found means not added or pending
          var oneUser = {
            email: element.email,
            username: element.username,
            fullName: element.fullName,
            status: 0
          };
          foundUsers.push(oneUser);
          //console.log(emailGiven +  " " + element.email)
          console.log(oneUser);                  
        }
      }
    });
  });

我有一个每个元素的对象数组我想为每个元素执行mongoDB调用,并且根据结果我想将结果推送到数组中,因为我正在做,问题是mongoDb是异步的所以我的主线程完成在我将结果推送到数组foundUsers之前,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

正如您所说,需要将异步操作处理为同步循环。为此,您可以使用异步库。它在这样的操作中非常有用。

首先在项目中安装异步模块 npm install --save async

之后,你可以这样做:

// for use with Node-style callbacks...
var async = require("async");

var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
var configs = {};

async.forEachOf(obj, (value, key, callback) => {
    fs.readFile(__dirname + value, "utf8", (err, data) => {
        if (err) return callback(err);
        try {
            configs[key] = JSON.parse(data);
        } catch (e) {
            return callback(e);
        }
        callback();
    });
}, err => {
    if (err) console.error(err.message);
    // configs is now a map of JSON data
    doSomethingWith(configs);
});

对于使用此库,它使用async.forEachOf函数而不是简单的forEach循环。三个参数发送到此功能。

  1. 传递给async.forEachOf的第一个参数是一个迭代它的数组(obj)。
  2. 第二个参数是一个回调函数,它适用于obj中的每个项目。
  3. 传递给async.forEachOf函数的第3个或最后一个参数也是另一个回调函数。当对obj中的每个项目的迭代过程完成时调用它。