[英]Error callback is not a function in node.js
我对JS很陌生,我不太了解回调,我一直在寻找针对此错误的修复程序,但似乎找不到它。 当我执行代码时,出现以下错误:TypeError:callback不是一个函数-> 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);
});
PS该代码通过console.log(a+" exists!");
在我看来,您的工作过于复杂,当您了解基本概念时,回调很容易理解。 我将在这里尝试对回调函数做一些介绍,也许您可以弄清楚自己的实现中出了什么问题。 考虑以下代码:
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); }
function(response) { console.log(response); }
作为lobbyExists
中的变量callback
的lobbyExists
。 这意味着在执行lobbyExists
,变量callback
现在引用该函数。 当您说callback(true)
您就是在调用function(response) { console.log(response); }
function(response) { console.log(response); }
,其中response
是true
。
我执行了代码片段,对我来说效果很好。 运行下面的代码。
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函数,因为如果找不到匹配项,则不会调用回调。
如果您无法使用它,请尝试在每个函数Ex中更改回调的变量名称:代替“ callback”,请使用“ cb”
我无法复制您所看到的内容。 在几个不同的条件下运行您的代码,我得到以下结果:
> 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
仅在没有要检查的大厅的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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.