繁体   English   中英

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

[英]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中的变量callbacklobbyExists 这意味着在执行lobbyExists ,变量callback现在引用该函数。 当您说callback(true)您就是在调用function(response) { console.log(response); } function(response) { console.log(response); } ,其中responsetrue

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

 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 由于您只想调用一次回调函数,因此一旦找到大厅,您将想要returnbreak 切换到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM