所以我试图获得一个带循环的数组,而nodejs的异步性质正在扼杀我。这是我的代码:
<asp:BoundField DataField="AcceptServerGroups" HeaderText="Accepted Server Group"
ItemStyle-Width="200px" meta:resourcekey="BoundFieldResource3">
<ItemStyle Width="200px" />
</asp:BoundField>
&#13;
getDevices(userIDs, function(result) {
if (result) {
sendNotification(messageUser, messageText, result);
res.send("Success");
} else {
res.send("ERROR");
}
});
});
function getDevices(userIDs, callback) {
var userDevices = [];
var device = [];
for (var i = 0; i < userIDs.length; i++) {
searchRegisterDevices(userIDs[i], function(result) {
if (result) {
for (var j = 0; j < result.length; j++) {
device = {platform: result[j].platform, token: result[j].token};
userDevices.push(device);
}
} else {
console.log("ERROR");
}
});
}
callback(userDevices);
}
&#13;
我首先需要从我的mongodb集合中获取与userIDs中的ID匹配的所有设备。 SO userID是绑定到集合中的设备的ID数组。一旦我得到设备,我需要从返回的对象中获取设备令牌。
所以: 1)调用getDevices传递一组userID 2)使用设备ID调用searchRegisterDevices。 3)searchRegisterDevices返回一组设备。 4)从该阵列中获取设备令牌/ s并推送到userDevices数组。 5)返回userDevices数组 6)使用userDevices数组调用sendNotification
我知道我的问题,我只是很难解决问题
答案 0 :(得分:1)
您应该使用单个查询获取用户设备,而不是为每个用户获取用户设备: 第一:它会减少通话次数 第二:它将节省你处理回调o / p。
因为它在运营商中使用$。
更改searchdevices方法:
function searchRegisterDevices(userID, callback) {
MongoClient.connect(url, function(err, db) {
if (err) {
console.log(err);
} else {
console.log("We are connected");
}
var collection = db.collection('RegisteredDevices');
collection.find({
userID: {
$in: userIDs
}).toArray(function(err, result) {
if (err) {
console.log("Error: " + err);
} else if (result.length) {
callback(result);
} else {
console.log('No document found');
}
db.close();
});
});
}
它将返回已传递的用户ID的用户设备数组。