【问题标题】:nodejs loop in asynchnodejs异步循环
【发布时间】:2017-02-09 00:46:43
【问题描述】:

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

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
}

我想在用户subMember 中添加每个sub2,但i 的ID 不等于i2 的东西(我不能在另一个i 的子成员中添加i2) .

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

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

【问题讨论】:

    标签: node.js mongodb asynchronous promise


    【解决方案1】:

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

    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.
    

    【讨论】:

    • 我不能使用绑定抛出这个TypeError: userstuff01.then(...).bind is not a function 但let i 工作。
    • 在function(i, sub2) 中交换 i 和 sub2 并且它有效。谢谢
    • 实际上,bind 需要上下文作为第一个参数,而我也没有包括在内。已更新。
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2019-02-15
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2015-03-14
    相关资源
    最近更新 更多