Цикл пропускает запись в базе данных Mongo - PullRequest
0 голосов
/ 27 мая 2018

Я столкнулся с очень специфической ошибкой.

У меня есть база данных со следующими записями:

{
    "_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

Имя пользователя1не обрабатывается.Что здесь происходит?

1 Ответ

0 голосов
/ 27 мая 2018

Предположим, что someFunction1 и someFunction2 выполняют некоторые вызовы API и ждут результатов в течение нескольких миллисекунд.

Привет, и это именно ваша проблема.Как только someFunction2 и someFunction1 получили данные из API, цикл уже запущен, и значение '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]);
		}
	}
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...