【问题标题】:Error callback is not a function in node.js错误回调不是 node.js 中的函数
【发布时间】:2019-06-09 12:53:21
【问题描述】:

我对 JS 很陌生,我不太了解回调,我一直在寻找解决此错误的方法,但似乎找不到。 当我执行代码时,我收到此错误:TypeError: callback is not a function -> 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);
        });

附:代码通过console.log(a+" exists!");

【问题讨论】:

    标签: javascript node.js callback


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我执行了代码 sn-ps,它对我来说工作得很好。 运行下面的代码。

      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

      【讨论】:

        【解决方案3】:

        在我看来,你把事情复杂化了,当你了解基本概念时,回调很容易理解。我将尝试在这里留下一些关于回调函数的入门知识,也许您可​​以找出在您自己的实现中出错的地方。考虑以下代码:

        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); } 函数作为lobbyExists 中变量callback 的引用传递。这意味着在执行lobbyExists 时,变量callback 现在引用该函数。当您说callback(true) 时,您因此调用function(response) { console.log(response); },其中responsetrue

        【讨论】:

          猜你喜欢
          • 2014-01-31
          • 1970-01-01
          • 2016-06-16
          • 2014-09-13
          • 1970-01-01
          • 2020-05-09
          • 2015-10-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多