我遇到了一个非常特殊的错误。
我有一个包含以下记录的数据库:
{
"_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);
}
});
}
}
}
假设someFunction1
和someFunction2
进行一些API调用并等待几毫秒的结果。
当我运行它时,控制台打印出来:
Updated last sent time for user: Name2
未处理用户Name1。这是怎么回事?
答案 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]);
}
}
}
希望有所帮助