Firebase:Query.on 失败:使用 1 个参数调用。预计至少 2
Firebase: Query.on failed: Was called with 1 argument. Expects at least 2
错误在标题中。
我构建的应用程序基于 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);
});
我发现 解决了同样的问题。解决方案是 Firebase 版本至少需要 2.4 才能使用 promises。我使用的是旧版本,但升级到 2.4.2 后,仍然出现相同的错误。我该怎么办?
编辑:修复后的代码。收到错误 "gamesRef.on(...).then is not a function"。
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();
}
});
你对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
虽然 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);
});
错误在标题中。
我构建的应用程序基于 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);
});
我发现
编辑:修复后的代码。收到错误 "gamesRef.on(...).then is not a function"。
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();
}
});
你对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
虽然 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);
});