循环跳过Mongo数据库中的记录

时间:2018-05-27 00:29:03

标签: javascript node.js mongodb

我遇到了一个非常特殊的错误。

我有一个包含以下记录的数据库:

{
    "_id": {
        "$oid": "xxxxxxxxxxxxxxxxx"
    },
    "name": "Name1",
    "number": 42
}

{
    "_id": {
        "$oid": "xxxxxxxxxxxxxxxxx"
    },
    "name": "Name2",
    "number": 123
}

在我的javascript代码中,我有以下代码:

MyRecords.find({}, function(err, results) {
    if (err) {
        console.log("Error finding phone recipients:", err);
    } else if (results.length == 0) {
        console.log("No users");
    } else {
        for (var i = 0; i < results.length; i++) {
            var result = results[i];

            someFunction2("", result);

            someFunction1(function(message) {
                someFunction2(message, result);
            });

            result.number = "Some new value"
            result.save(function(err) {
                if (err) {
                    console.log("Error updating last sent for", result.name);
                } else {
                    console.log("Updated last sent time for user:", result.name);
                }
            });
        }
    }
}

假设someFunction1someFunction2进行一些API调用并等待几毫秒的结果。

当我运行它时,控制台打印出来:

Updated last sent time for user: Name2

未处理用户Name1。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

  

假设someFunction1和someFunction2进行一些API调用并等待几毫秒的结果。

嗨,确实存在问题。一旦someFunction2和someFunction1从API检索了数据,循环就已经运行了,'result'的值将是循环中的最后一个。

避免这种情况的一种方法是将它们抽象为循环外部的函数,该函数接收'result'作为参数,如下所示:

MyRecords.find({}, function(err, results) {
	
	function processResult(result) {
		someFunction2("", result);
		someFunction1(function(message) {
			someFunction2(message, result);
		});
		result.number = "Some new value"
		result.save(function(err) {
			if (err) {
				console.log("Error updating last sent for", result.name);
			} else {
				console.log("Updated last sent time for user:", result.name);
			}
		});
	}
	
	if (err) {
		console.log("Error finding phone recipients:", err);
	} else if (results.length == 0) {
		console.log("No users");
	} else {
		for (var i = 0; i < results.length; i++) {
			processResult(results[i]);
		}
	}
}

希望有所帮助