错误回调不是node.js中的函数

时间:2019-01-15 13:42:38

标签: javascript node.js callback

我对JS还是很陌生,我不太了解回调,我一直在寻找针对此错误的修复程序,但似乎找不到它。 当我执行代码时,出现此错误:TypeError:回调不是函数-> callback(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 :(得分:0)

在我看来,您正在使事情变得过于复杂,当您了解基本概念时,回调很容易理解。我将在这里尝试对回调函数做一些介绍,也许您可​​以弄清楚自己的实现中出了什么问题。考虑以下代码:

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); },其中responsetrue

答案 1 :(得分:0)

我执行了代码片段,对我来说效果很好。 运行下面的代码。

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);
});

但是我更改了lobbyExists功能,因为如果找不到匹配项,则不会调用回调。

如果无法正常工作,请尝试在每个函数中更改回调的变量名 例如:使用“ cb”代替

More about callbacks

Similar question on stack

答案 2 :(得分:0)

我无法复制您所看到的内容。在几个不同的条件下运行您的代码,我得到以下结果:

> 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。由于您只想调用一次回调函数,因此一旦找到大厅,您将想要returnbreak。切换到for i循环可让我们执行任一操作。
  • 使用==进行比较是所谓的松散或抽象相等,这可能会导致错误-您可以阅读松散(==)和严格(===)相等here之间的区别。
  • 如果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);
}