我不能停止异步

时间:2016-09-26 16:11:57

标签: javascript android arrays node.js mongodb

所以我试图获得一个带循环的数组,而nodejs的异步性质正在扼杀我。这是我的代码:



<asp:BoundField DataField="AcceptServerGroups" HeaderText="Accepted Server Group"
    ItemStyle-Width="200px" meta:resourcekey="BoundFieldResource3">
    <ItemStyle Width="200px" />
</asp:BoundField>
&#13;
&#13;
&#13;

&#13;
&#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;
&#13;
&#13;

我首先需要从我的mongodb集合中获取与userIDs中的ID匹配的所有设备。 SO userID是绑定到集合中的设备的ID数组。一旦我得到设备,我需要从返回的对象中获取设备令牌。

所以: 1)调用getDevices传递一组userID 2)使用设备ID调用searchRegisterDevices。 3)searchRegisterDevices返回一组设备。 4)从该阵列中获取设备令牌/ s并推送到userDevices数组。 5)返回userDevices数组 6)使用userDevices数组调用sendNotification

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

1 个答案:

答案 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的用户设备数组。