2016-05-10 1 views
2

Ошибка указана в заголовке.Firebase: Query.on failed: вызывается с 1 аргументом. Ожидается не менее 2

Приложение I I Building основано на React and 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 для использования обещаний. Я использовал более старую версию, но после обновления до 2.4.2 я все равно получаю ту же ошибку. Что мне делать?

Редактировать: Код после исправления. Get error "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(); 
     } 
    }); 

ответ

4

Вы неправильно мышление о на + то,

на принимает 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; 
}) 

, а затем вы можете использовать следующее: D

+0

Ok, спасибо! Я сделал, как вы сказали, и ошибка исчезла. Тем не менее, я получил новый: «gamesRef.on (...), а затем не является функцией». Вы знаете, как я это исправить? Я добавил обновление к вопросу. – hellogoodnight

+1

Почему бы вам не пойти прямо и избежать «тогда»? 'gamesRef.on ('значение', функция (снимок) {// найти все пустые игры вар gamesToRemove = [];. snapshot.forEach (игра => { если (game.val() player1 = = "" && game.val(). Player2 == "" && game.val(). Player3 == "" && game.val(). Player4 == "") { gamesToRemove.push (игра .key());} }); для индекса (вар в gamesToRemove) { gamesRef.child (gamesToRemove [индекс]) удалить();. }; }); ' –

7

Хотя многие функции в Firebase JavaScript client return a promise, 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); 
}); 
+0

Благодарим вас за простое, понятное объяснение – Akil

 Смежные вопросы

  • Нет связанных вопросов^_^