Firebase:Query.on失败:使用1参数调用.预计至少2

hel*_*ght 6 javascript promise firebase firebase-realtime-database

错误在标题中.

我正在构建的应用程序基于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);
    });
Run Code Online (Sandbox Code Playgroud)

在SO上发现了这个问题,解决了同样的问题.解决方案是Firebase版本需要至少2.4才能使用promises.我使用的是旧版本,但在升级到2.4.2之后,我仍然遇到了同样的错误.我该怎么办?

编辑:修复后的代码.得到错误"gamesRef.on(...).然后不是一个函数".

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();
      }
    });
Run Code Online (Sandbox Code Playgroud)

Dan*_*ski 11

你有错误的心态,然后,

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;
})
Run Code Online (Sandbox Code Playgroud)

然后,你可以使用你的那个:D


Fra*_*len 10

虽然Firebase JavaScript客户端中的许多功能都会返回一个承诺,但on()不是其中之一.

这样做的原因是,on()通常会多次提供一个值,而承诺的合同then()最多只能解决一次.

如果您只关心获取数据的值一次,您可以使用once()和承诺:

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);
});
Run Code Online (Sandbox Code Playgroud)