【问题标题】:how for loop work in node.js?node.js 中的 for 循环如何工作?
【发布时间】:2016-05-06 06:57:31
【问题描述】:

在我的循环中,我有一个这样的组 id

  ****variable i value****
      groupid  0 199
      groupid  1 200
      groupid  2 201

但在 for 循环中,它总是在第一次迭代中使用组 201,为什么会发生这种情况。这是我的代码。

for (var i = 0; i < groupdata.length; i++) {
    console.log('groupid', i, groupdata[i].id);
    var groupname = groupdata[i].name;
    var groupid = groupdata[i].id;
    var groupType = groupdata[i].groupType;
    var getuserdata = {
        "groupID": groupdata[i].id,
        "groupType": groupdata[i].groupType,
        "token": req.usersession.token
    };
    var digest = BASE.utils.hmac("sha1", "A12AA418-1F28-4464-8B67-29CBD02BC45C-F048B14F-F3E3-4F97-A522-F2275A364A0E", JSON.stringify(getuserdata));

    var postData = {
        "groupID": groupdata[i].id,
        "groupType": groupdata[i].groupType,
        "digest": digest,
        "token": req.usersession.token
    };



    var groupUserData = BASE.utils.base64encode(BASE.utils.base64encode(JSON.stringify(postData)));


    BASE.request({
            url: "http://example.com/getGroupUsers/",
            method: "POST",
            headers: {

                "content-type": "application/json",
            },
            body: groupUserData
        },
        function(err, result, groupUserdata) {

            var groupuserdata = JSON.parse(groupUserdata);
            console.log('first groupusers.....', i, groupuserdata);

            var groupids = groupuserdata.groupUsers.filter(function(group) {
                if (group.userID != contactid) {
                    userbody.groups.map(function(usr) {
                        if (usr.id == groupid) {
                            console.log('maingroupid....', usr.id);
                            console.log('current loop groupid..', groupid);
                            group.groupData = usr;
                        }
                        return usr;
                    })
                    return group;
                }
            });
            //console.log(groupids);
            newgroupdta.push(groupids);
            //res.send(groupids);
            //  console.log(groupids);
            //console.log('.............',newgroupdta);
        });
}
            /* end for loop */

        }); 

groupdata 具有以下值

groupdata.... [ { groupType: '1',
    id: '199',
    unreadMessages: '0',
    ownerId: '339',
    name: 'xyz' },   { groupType: '1',
    id: '200',
    unreadMessages: '0',
    ownerId: '339',
    name: 'second group' },   { groupType: '1',
    id: '201',
    unreadMessages: '0',
    ownerId: '339',
    name: 'new one' } ]

groupusers 数据如下

 { groupUsers: [ { userID: '0' }, { userID: '31' }, { userID: '326' } ] }

基本上我想检查 groupusers 中存在的 326 的 contactid 如果不是,则返回数组中的特定组数据,例如 {groupdata:[{groupname:,groupid:}]}

/*********************edit***********************/
var count = 0;
                    var i =0;
                function outer(data){

                         if(count==groupdata.length)break;

                        var groupname = groupdata[i].name;
                        var groupid = groupdata[i].id;
                        var groupType =groupdata[i].groupType;
                    var getuserdata = {
                        "groupID" :groupdata[i].id,
                         "groupType" : groupdata[i].groupType,
                         "token":req.usersession.token   


                    };



                var digest = BASE.utils.hmac("sha1", "A12AA418-1F28-4464-8B67-29CBD02BC45C-F048B14F-F3E3-4F97-A522-F2275A364A0E", JSON.stringify(getuserdata));

                var postData = {
                "groupID" :groupdata[i].id,
                "groupType" : groupdata[i].groupType,
                "digest"      :  digest,
                "token" : req.usersession.token           
                };      

                var groupUserData = BASE.utils.base64encode(BASE.utils.base64encode(JSON.stringify(postData)));


                BASE.request({
                url : "http://201.206.158.254:8080/BACKSTAFF/service/getGroupUsers/",
                method :"POST",
                headers : {

                    "content-type": "application/json",
                },
                    body :groupUserData
                },
            function (err,result,groupUserdata) {

                    console.log(groupUserdata); 

                    });
                    i++;
                    outer(groupdata[count++]);
                    }
/***************end edit *************************/

【问题讨论】:

  • 你能正确地写出你想要的@Sumit
  • 实际上我有一个组数据,我在其中获得了用于获取 groupusers 下 groupusers 的 groupid 我必须找到特定用户是否存在,如果不存在则将该特定数据返回到数组中,包括 groupname ,组类型,组ID。我希望我清楚
  • 看起来是同步循环内异步函数调用的另一个问题。
  • @LeonidBeschastny 是的,正是当我打印日志时,它在循环中取最后一个 groupid 不是一个一个一个,你有解决方案吗
  • 我如何在没有循环的情况下工作,因为我需要 groupid 来使用 webservice 获取 groupusers

标签: javascript node.js filter


【解决方案1】:

您已经在 for 循环中编写了异步回调函数。 根据您上面的代码,BASE.request({},function(){}) 方法将被异步调用,它不会等待结果,for 循环将移至下一个。

有多种方法可以解决这个问题:

1) Async.js

2) 递归(移除 for 并从回调内部调用 next 方法,最后中断并退出循环)

var count = 0;
function outer(data){
   BASE.request({},function(){
        if(count==groupdata.length)return;
        //whatever logic        
        outer(groupdata[count++]);
   })
}

3)Eventemitter也可以使用

【讨论】:

  • 我是新手,您能告诉我如何使用它吗?
  • 外部(数据)数据代表什么?
  • 下一次迭代数据,而不是在 for 循环中循环。你可以通过递增计数器来循环
  • Opps 它必须返回
  • 嘿嘿,这只是一个逻辑,你需要自己这样实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
相关资源
最近更新 更多