我无法停止asynchronous

所以我试图得到一个循环的数组,nodejs的asynchronous性质正在杀死我。 这是我的代码:

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); } 

 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: userID}).toArray(function (err, result) { if (err) { console.log("Error: " + err); } else if (result.length) { callback(result); } else { console.log('No document found'); } db.close(); }); }); 

我首先需要从我的mongodb集合中取出所有与用户标识中的ID匹配的设备。 SO userIDs是与该集合中的设备绑定的ID的数组。 一旦我拿到设备,我需要从返回的对象中获取设备标记。

所以:1)调用getDevices传递一个用户ID数组2)调用searchRegisterDevices一个设备ID。 3)searchRegisterDevices返回一个设备数组。 4)将设备令牌从该数组中取出并推送到userDevices数组。 5)返回userDevices数组6)调用sendNotification与userDevices数组

我知道我的问题,我只是很难解决他们

而不是获得每个用户的用户设备,你应该得到他们使用单一的查询:第一:这将减less呼叫次数第二:它将节省您处理callbacko / p。

因为它使用$ in操作符。

更改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(); }); }); } 

它将返回所传递的用户标识的用户设备数组。