2016-05-06 34 views
0

在我的循環,我有這樣的如何在node.js中循環工作?

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

一組ID,但在循環的總是組201在第一次迭代爲什麼這個happend。這是我的代碼。

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' } ] } 

基本上我想要查詢的ContactID是326 groupusers 存在,如果沒有,則返回該特定groupdata排列如 {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 *************************/ 
+0

你能寫正確你想@Sumit – Sumeet

+0

實際到底是什麼我有一個組數據,其中我得到我用來獲取羣組用戶下的羣組用戶,我必須找到一個特定的用戶存在或不存在,如果不是,然後返回特定的數據到數組包括組名,羣組類型,groupid。我希望我清除 –

+0

看起來像同步循環內異步函數調用的又一個問題。 –

回答

0

你在for循環裏寫了異步回調函數。 按照上面的代碼BASE.request({},function(){})方法將被異步調用,它不會等待結果,for循環將移到下一個。

有多種方式來處理這個問題:

1)Async.js

2)遞歸(取出並從內回調,最後斷裂調用下一個方法,並提出了循環)

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

3)Eventemitter也可用於

+0

我是新來的這個,請你告訴我如何使用這個? –

+0

外(數據)數據代表什麼? –

+0

接下來的迭代數據,而不是循環for循環。你可以通過增加計數器 – Sumeet