【问题标题】:How do I use async in node.js如何在 node.js 中使用异步
【发布时间】:2016-08-23 14:26:46
【问题描述】:

我在node.js 中创建了一个使用 mongoDB 的代码。一切正常,但是当我使用嵌套循环时,它会中断并且不会返回正确的值。

DB1.find({},function(error,fetchAllDB1) {
    var mainArray = new Array();
    for (var i in fetchAllDB1) {
        if(fetchAllDB1[i].name) {
            var array1  = new Array();
            var array2  = new Array();

            array1['name'] = fetchAllDB1[i].name;
            array1['logo'] = fetchAllDB1[i].logo;
            array1['desc'] = fetchAllDB1[i].desc;    

            DB2.find({is_featured:'1', brand_id: fetchAllDB1[i]._id}, function(error,fetchDB2) {
                for (var p in fetchDB2) {
                    var pArr=[];
                    pArr['_id']    = fetchDB2[p]._id;
                    pArr['name']   = fetchDB2[p].name;
                    pArr['sku']    = fetchDB2[p].sku;
                    pArr['description'] = fetchDB2[p].description;

                    console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
                    console.log(pArr);
                    console.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<');
                    array2[p]=pArr;
                } 
                array1['pp']= array2;
            });
            mainArray[i]=array1;
        }
    }
    console.log('######### LAST #########');
    console.log(mainArray);
    console.log('######### LAST #########');
});

在我的控制台消息中显示

 console.log('######### LAST #########');

  All Values

  console.log('######### LAST #########');

之后

console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
All Values;
console.log('<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<');

我想在我的代码中使用异步,以便所有数据获取如下:

mainarray =
[
    [array1] = All Values
    [array2] = [0]
               [1]  
]

mainarray =
[
    [array1] = All Values
    [array2] = [0]
               [1]  
]

【问题讨论】:

  • 您的代码是如何工作的?我的意思是for (var i in fetchAllDB1) i 应该是一个对象,但你将它用作整数?
  • 添加到@Stan 的评论中,DB2 是什么?集合还是实际的数据库?如果是数据库,你在查询什么?我在文档中没有看到 db 有 find 方法...
  • 不管怎样,你要找的是这个库,在那里你可以在循环中进行异步操作。 caolan.github.io/async
  • 不要使用异步(建议)。改用承诺。您的代码将更加清晰且易于调试。确实,如果您以前没有使用过 Promise,那么处理它需要一些努力,但可能不会比修复和维护基于异步的方法所需的多。

标签: arrays node.js mongodb asynchronous


【解决方案1】:

您的代码非常混乱且过于复杂。

你应该做的是(伪代码):

DB1.find(foo) // returns one result
    .then(getFromDB2);

function getFromDB2 (res){
    return DB2.find(res); // make a query here with mongo drivers `$in`
}

Mongodb : $in operator vs lot of single queries

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2014-10-31
    • 2023-03-26
    • 1970-01-01
    • 2021-07-29
    • 2018-06-08
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多