Увеличение атомного счетчика в базе данных реального времени Firebase - PullRequest
0 голосов
/ 20 сентября 2018

Мне нужно уменьшить счетчик (с именем credits ), хранящийся в базе данных Firebase в реальном времени.

Чтобы уменьшить счетчик, я делаю так:

var ref = admin.database().ref('licenseCredits/' + name + '/credits');

ref.transaction( (value) => {

  if (value === null) {
    return 0;
  } else if (typeof value === 'number') {

    return value - 1;
  } else {
    console.log('The counter has a non-numeric value: '); 
  }
});

Поле credits корректно уменьшается.Я поместил этот код в вызываемую функцию, но я не знаю, как вернуть уменьшенное значение вызывающей стороне.Если я просто возвращаю результат ref.transaction, я получаю «Необработанное исключение RangeError».

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

В конце я нашел способ решения проблемы с учетом @chris ответа.

Я использовал обещание JavaScript, реализованное с использованием библиотеки 'kew'.

Вот рабочий код:

   var qTrans = Q.defer();

    var ref = admin.database().ref('licenseCredits/' + name + '/credits');
    var credits = 0;



    ref.transaction( (value) => {

      if (value === null) {
        // the counter doesn't exist yet, start at one
        return 1;
      } else if (typeof value === 'number') {
        // increment - the normal case
        return value + 1;
      } else {
        // we can't increment non-numeric values
        console.log('The counter has a non-numeric value: ' + JSON.stringify(value));
        // letting the callback return undefined cancels the transaction
      }
    }, (error, committed, snapshot) => {
        if (error) {
            console.log('Transaction failed abnormally!', error);
            qTrans.reject(error);

        } else if (!committed) {
            console.log('We aborted the transaction.');
            qTrans.reject(error);

        } else {
            console.log('Success!');
            console.log("Credit data: ", snapshot.val());
            qTrans.resolve(snapshot.val());

        }
    });

    return qTrans.promise;
0 голосов
/ 20 сентября 2018

Согласно документации ниже, должна быть реализована функция onComplete.

https://firebase.google.com/docs/reference/js/firebase.database.Reference#transaction

var ref = admin.database().ref('licenseCredits/' + name + '/credits');
ref.transaction( (value) => {

    if (value === null) {
        return 0;
    } else if (typeof value === 'number') {
        return value - 1;
    } else {
        console.log('The counter has a non-numeric value: '); 
    }
}, function(error, committed, snapshot) {
    if (error) {
        console.log('Transaction failed abnormally!', error);
    } else if (!committed) {
        console.log('We aborted the transaction.');
    } else {
        console.log('Success!');
    }
    console.log("Credit data: ", snapshot.val());
});
...