Я не могу воспроизвести то, что вы видите. Запустив ваш код в нескольких различных условиях, я получил следующие результаты:
> var lobbies = [{ lobbyName: 'foo' }];
> doesLobbyExist('foo', console.log)
foo exists!
true
> doesLobbyExist('bar', console.log)
...
> var lobbies = [{ lobbyName: 'foo' }, { lobbyName: 'bar' }, { lobbyName: 'foo' }];
> doesLobbyExist('bar', console.log)
bar exists!
true
> doesLobbyExist('foo', console.log)
foo exists!
true
foo exists!
true
...
> var lobbies = [];
> doesLobbyExist('foo', console.log)
false
но в вашем коде есть пара проблем:
lobbyExists
дает ответ false
только в том случае, если нет лобби для проверки, он может вызывать обратный вызов несколько раз, если есть несколько лобби с одним и тем же именем, и ничего не возвращает, если лобби не найдено.
- нет простого способа вырваться из
forEach
. поскольку вы хотите вызывать функцию обратного вызова только один раз, вам нужно будет либо return
, либо break
, как только лобби будет найдено. переключение на цикл for i
позволяет нам сделать один из них.
- Сравнение с использованием == - это то, что известно как слабое или абстрактное равенство, которое может привести к ошибкам в будущем - вы можете прочитать разницу между свободным (==) и строгим (===) равенством здесь .
- если функция
lobbyExists
выполняет итерацию только через массив, то нет необходимости рассматривать его как асинхронный и использовать обратный вызов. синхронные обратные вызовы - вещь, и они прекрасно подходят для использования, но об этом нужно знать, когда вы продолжаете развиваться.
С учетом всего сказанного, я бы предложил следующие изменения:
function doesLobbyExist(a, callback) {
lobbyExists(a, function(random_data) {
//possibly do other things to random_data...
callback(random_data);
});
}
function lobbyExists(a, callback) {
for(var i = 0; i < lobbies.length; i++) {
var l = lobbies[i];
if(l.lobbyName === a) {
console.log(a + " exists!");
callback(true);
return;
}
}
callback(false);
}