我对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!");
答案 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); }
,其中response
是true
。
答案 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”代替
答案 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
。由于您只想调用一次回调函数,因此一旦找到大厅,您将想要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);
}