Ошибка обратного вызова не является функцией в node.js - PullRequest
0 голосов
/ 15 января 2019

Я довольно новичок в JS, и я не очень понимаю обратные вызовы, и я искал исправление для этой ошибки, но я не могу найти его. Когда я выполняю код, я получаю эту ошибку: TypeError: обратный вызов не является функцией -> обратный вызов (false);

function doesLobbyExist(a, callback) {
  lobbyExists(a, function(random_data) {
    callback(random_data);
  });
}
function lobbyExists(a, callback) {
  if(lobbies.length > 0){
        lobbies.forEach(function(l) {
            if(l.lobbyName == a){
                console.log(a+" exists!");
                callback(true);
            }
        });
    }else{
        callback(false);
    }
}

И я называю это так:

doesLobbyExist(a.ln, function(result) {
            console.log(result);
        });

P.S. код проходит через console.log(a+" exists!");

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Я выполнил фрагменты кода, и у меня все заработало. Запустите код ниже.

var lobbies = [{lobbyName:"a"}]

function doesLobbyExist(a, callback) {
  lobbyExists(a, function(random_data) {
    callback(random_data);
  });
}

function lobbyExists(a, callback) {
    if(lobbies.length > 0){
        var bool = false
        lobbies.forEach(function(l) {
            if(l.lobbyName == a){
                bool = true;
            }
        });
        callback(bool);
        return false;
    }
    callback(false);
}

doesLobbyExist("a", function(result) {
    console.log(result);
});

Однако я немного изменил функциюobbyExists, так как обратный вызов не будет вызываться, если совпадений не найдено.

Если вы не смогли заставить его работать, попробуйте изменить имя переменной обратных вызовов в каждой функции Пример: вместо «обратного вызова» используйте «cb»

Подробнее о обратных вызовах

Аналогичный вопрос по стеку

0 голосов
/ 15 января 2019

Я не могу воспроизвести то, что вы видите. Запустив ваш код в нескольких различных условиях, я получил следующие результаты:

> 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);
}
0 голосов
/ 15 января 2019

Мне кажется, что вы слишком усложняете вещи, обратные вызовы просты для понимания, когда вы получаете базовую концепцию. Я просто попытаюсь оставить здесь небольшой пример по функциям обратного вызова, и, возможно, вы сможете выяснить, в чем вы ошиблись в своей собственной реализации. Рассмотрим следующий код:

function lobbyExists(a, callback) {
  if (a === 1) {
    callback(true);
  } else {
    callback(false);
  }
}

lobbyExists(1, function(response) {
  console.log(response);
});

lobbyExists(0, function(response) {
  console.log(response);
});

В этом случае вы передаете всю функцию function(response) { console.log(response); } как ссылку в переменную callback в lobbyExists. Это означает, что при выполнении lobbyExists переменная callback теперь ссылается на эту функцию. Когда вы говорите callback(true), вы, следовательно, звоните function(response) { console.log(response); }, где response равно true.

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