как работать цикл в node.js?

98
15

В моем цикле у меня есть идентификатор группы

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

но для цикла он всегда принимает группу 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: [ { userID: '0' }, { userID: '31' }, { userID: '326' } ] }

В принципе, я хочу проверить contactid, который существует 326, в groupusers, если нет, то возвратить эту конкретную группу данных в массив, например {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 *************************/

спросил(а) 2016-05-06T09:57:00+03:00 4 года, 11 месяцев назад
1
Решение
87

Вы записали асинхронную функцию обратного вызова внутри цикла. В соответствии с вашим кодом выше BASE.request({},function(){}) метод BASE.request({},function(){}) будет вызываться асинхронно, он не будет ждать результата и цикл будет переходить к следующему.

Существует несколько способов справиться с этим:

1) Async.js

2) Recursion (Удалить и вызвать следующий метод из внутреннего обратного вызова и, наконец, выйти из цикла)

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

3) Также можно использовать Eventemitter

ответил(а) 2016-05-06T10:17:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема