在异步

时间:2017-02-08 11:55:51

标签: node.js mongodb asynchronous promise

我在登录时向用户发送用户信息。

var userstuff00 = findSub(user['id']);
userstuff00.then(function(sub){
    for(var i in sub){
        var userstuff01 = findSub(sub[i.toString()]['id']);
        userstuff01.then(function(sub2){
            for(var i2 in sub2){
                 //here i is the last object in sub but i2 is for the first i
                console.log(sub[i.toString()]);
                console.log(sub2[i2.toString()]);
            }
        });
    }
});

这是findSub函数,其中usercollection是mongodb表:

function findSub(stuffCode){
        var tempMembers = usercollection.find({'stuff ': stuffCode});
        return tempMembers;
}

这是用户对象:

user{
    id,
    name,
    stuff,
    subMember[] //list of users where their stuff equals to this users id
}

我想在用户sub2中添加每个subMember,但i的ID不等于i2的内容(我无法添加i2 }在另一个i的子成员中。)

如何获取第一个i的子成员,然后找到第二个i的子成员?

我的目标是将用户作为子成员的用户列表,这些用户(子成员级别1)具有子成员(子成员级别2)等等(最高级别10): Family Tree

1 个答案:

答案 0 :(得分:0)

使用异步代码时,这是一个典型问题:同步代码将在 任何异步代码之前完成。所以这个循环:

for(var i in sub)

...将完成,然后执行其中的任何then回调。因此,当其中一个被执行时, i 的值已经是 sub 的长度。

为了能够在您调用then(而不是其回调)时使用 i 的值,有不同的解决方案。其中之一是使用let i而不是var i,因为它将在for循环的每次迭代中定义一个不同的变量。或者您可以将 i 的值绑定为then回调的参数:

    userstuff01.then(function(i, sub2){
    //                        ^^^ added parameter
        for(var i2 in sub2){
             //here i is the last object in sub but i2 is for the first i
            console.log(sub[i.toString()]);
            console.log(sub2[i2.toString()]);
        }
    }.bind(null, i));
 //    ^^^^^^^^^^^ bind the parameter value to the current value of i.