【问题标题】:Firebase: Query.on failed: Was called with 1 argument. Expects at least 2Firebase:Query.on 失败:使用 1 个参数调用。预计至少 2
【发布时间】:2016-09-05 04:26:38
【问题描述】:

错误在标题中。

我正在构建的应用基于 React 和 Firebase。 我正在尝试使用承诺。 这是我的代码:

gamesRef.on('value').then(function(snapshot){
      // find all empty games
      var gamesToRemove = [];
      snapshot.forEach(game => {

        if(game.val().player1 == ""
          && game.val().player2 == ""
          && game.val().player3 == ""
          && game.val().player4 == ""){
            gamesToRemove.push(game.key());
        }
      });
      return gamesToRemove;
    }).then(function(gamesToRemove){
      // remove all empty games
      for(var index in gamesToRemove){
        gamesRef.child(gamesToRemove[index]).remove();
      }
    }, function(error){
      console.log(error);
    });

我发现this question on SO 解决了同样的问题。解决方案是 Firebase 版本至少需要 2.4 才能使用 Promise。我使用的是旧版本,但升级到 2.4.2 后,我仍然遇到同样的错误。我该怎么办?

编辑:修复后的代码。得到错误“gamesRef.on(...).then 不是函数”。

gamesRef.on('value', function(snapshot){
      // find all empty games
      var gamesToRemove = [];
      snapshot.forEach(game => {

        if(game.val().player1 == ""
          && game.val().player2 == ""
          && game.val().player3 == ""
          && game.val().player4 == ""){
            gamesToRemove.push(game.key());
            console.log("denna borde raderas: " + game.key());
        }
      });
      return gamesToRemove;

    }).then(function(gamesToRemove){
      // remove all empty games
      for(var index in gamesToRemove){
        gamesRef.child(gamesToRemove[index]).remove();
      }
    });

【问题讨论】:

    标签: javascript firebase promise firebase-realtime-database


    【解决方案1】:

    虽然Firebase JavaScript client return a promise 中有许多功能,但on() 不是其中之一。

    原因是on() 通常会多次传递一个值,而承诺的约定是then() 最多会解析一次。

    如果你只关心获取一次数据的价值,你可以使用once()和一个promise:

    gamesRef.once('value').then(function(snapshot){
      // find all empty games
      var gamesToRemove = [];
      snapshot.forEach(game => {
    
        if(game.val().player1 == ""
          && game.val().player2 == ""
          && game.val().player3 == ""
          && game.val().player4 == ""){
            gamesToRemove.push(game.key());
        }
      });
      return gamesToRemove;
    }).then(function(gamesToRemove){
      // remove all empty games
      for(var index in gamesToRemove){
        gamesRef.child(gamesToRemove[index]).remove();
      }
    }.catch(function(error){
      console.log(error);
    });
    

    【讨论】:

    • 这应该是公认的答案,感谢您解释 on() 和 once() 之间的区别!现在听起来有效..
    【解决方案2】:

    你对on+then有错误的心态,

    on 有 2 个参数:事件的名称和回调,回调只是一个以事件为参数的普通函数:

     gamesRef.on('value', function(snapshot){
      // find all empty games
      var gamesToRemove = [];
      snapshot.forEach(game => {
    
        if(game.val().player1 == ""
          && game.val().player2 == ""
          && game.val().player3 == ""
          && game.val().player4 == ""){
            gamesToRemove.push(game.key());
        }
      });
      return gamesToRemove;
    })
    

    然后,你可以使用你的 then :D

    【讨论】:

    • 好的,谢谢!我按照你说的做了,错误消失了。但是,我得到了一个新的:“gamesRef.on(...).then 不是函数”。你也知道我是怎么解决的吗?我添加了对问题的更新。
    • 你为什么不直接走,避开“then”呢? gamesRef.on('value', function(snapshot){ // find all empty games var gamesToRemove = []; snapshot.forEach(game => { if(game.val().player1 == "" && game.val().player2 == "" && game.val().player3 == "" && game.val().player4 == ""){ gamesToRemove.push(game.key()); } }); for(var index in gamesToRemove){ gamesRef.child(gamesToRemove[index]).remove(); }; });
    猜你喜欢
    • 2016-06-02
    • 2019-07-27
    • 1970-01-01
    • 2022-01-07
    • 2021-03-14
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多