Как заставить код после чтения из базы данных произойти после того, как чтение произошло - PullRequest
0 голосов
/ 21 мая 2019

При тестировании моего кода журналы консоли будут 2: 0 (несколько раз), 3: 0 (один раз), 1: _ (несколько раз, когда _ увеличивается каждый раз).

Яне знаете, как заставить 1 произойти до 2 и 3, чтобы при записи в базу данных (после журнала 3) значение не было 0.

Я не уверенкак подойти к этой проблеме, поскольку у меня нет опыта работы с огненной базой.

  var count=0;
  var total=0;

  var ass_ref = admin.database().ref("modules/"+mod+"/Assignments");
  return ass_ref.once("value", function(snapshot) {

    snapshot.forEach(function(child) {

      var name = child.key;

      var ref = admin.database().ref("modules/"+mod+"/Assignments/"+name+"/"+uid);
      ref.once("value", function(mark) {

          count++;
          total=total+ parseInt(mark.val(),10);
          console.log("1:"+total);  //Value increases each time but occurs after 3

      });

      console.log("2:"+total);  //Value = 0 (occurs multiple times, in foreach)

    });

    console.log("3:"+total);  //Value = 0, logs once, after "2"

Я желаю, чтобы 1 произошел до 2 (я полагаю, это будет записано как 1,2,1,2 ...)так что конечное значение, зарегистрированное в 3, совпадает с последним значением, зарегистрированным в 1.

1 Ответ

0 голосов
/ 22 мая 2019

Ниже мое рабочее решение, оно, вероятно, не оптимально, но выполняет свою работу.Спасибо Дугу Стивенсону за предоставленную ссылку на полезный учебный материал.Этот похожий пост оказался очень полезным: Promise.all с Firebase DataSnapshot.forEach

...

var ref = admin.database().ref("modules/"+mod+"/Assignments");

return ref.once('value').then(function(snapshot) {
    var reads = [];

    snapshot.forEach(function(childSnapshot) {
        var id = childSnapshot.key;

        var ref = admin.database().ref("modules/"+mod+"/Assignments/"+id+"/"+uid);
        var promise = ref.once("value", function(mark) {
            // The Promise was fulfilled.
        }, function(error) {
            // The Promise was rejected.
            console.error(error);
        });
        reads.push(promise);
    });
    return Promise.all(reads);

}, function(error) {
    // The Promise was rejected.
    console.error(error);
}).then(function(values) { 
    total=0;
    count = values.length
    values.forEach(snap => {
      var data = parseInt(snap.node_.value_)
      total=total+data
    })
    var average = total/count;
    console.log(total)
    console.log(count)
    console.log(average)

    var reads = [];
    var p1 =admin.database().ref('/student/'+uid+"/modules/"+mod).set(average);
    var p2 =admin.database().ref('/student/'+uid+'/points/grades').transaction(function(prev){
      return parseInt(total,10)+score;
    });
    reads.push(p1);
    reads.push(p2);
    return Promise.all(reads);

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...