Один запрос записи базы данных firebase выполняется несколько раз - PullRequest
0 голосов
/ 02 августа 2020

У меня есть база данных Firebase, в которой некоторые имена хранятся под некоторыми случайными ключами. У меня есть облачная функция, которая должна взять 1 случайное имя и добавить его к некоторому ключу.

Вот мой код

Promise.all(w_names.names).then((final_names_a) => {
  w_names.names = final_names_a;
  ref.orderByChild('name').startAt(inp_data.start).limitToFirst(2).on('value', (snapshot) => {
    snapshot.forEach((twish) => {
      console.log(`Line 129: ${twish.key}`);              // <------------ Log
      twish.call = false;
      resp_pro.push(process_wish_request(twish));         // <------------ Function call
    });
    Promise.all(resp_pro).then((_v) => {
      send_response(res, 200, {val: snapshot.toJSON()});
    })
  });
});

let process_wish_request = async (snapshot) => {
  console.log(`process_with_request: key = ${snapshot.key}`)
  if (snapshot.hasChild('allowed') && snapshot.child('allowed').val()) {
    snapshot.call = false;
    let tmp_resp = {};
    tmp_resp = {
      id: snapshot.key,
      msg: snapshot.child('name').val(),
      photo: snapshot.child('photo').val()
    };
    if (!snapshot.hasChild('options')) {
      await generate_options_for_wish(snapshot); 
    } else {
      return Promise.resolve(true);
    }
  } else {
    return Promise.resolve(true);
  }
};

let generate_options_for_wish = (snapshot) => {

  let rand1 = gen_rand_nums(w_names.names.length);
  // let rand2 = gen_rand_nums(w_names.names.length);
  while (w_names.names.length > 1 && rand1 === snapshot.key) rand1 = gen_rand_nums();

  let rand_names = [
    w_names.names[rand1]
  ];
  console.log(snapshot.call);
  if (snapshot.call != undefined && snapshot.call == false) {
    snapshot.call = true;
    return new Promise((res, rej) => {
      console.log(`Line 74: ${rand_names.length}`);
      db.ref('wishes').child(snapshot.key).child('options').child(rand_names[0].id).set(0).then((_) => {
        res(true);
      });
    })
  } else {
    
  }
};

Если я закомментирую этот вызов функции, приведенное выше Журнал печатается 2 раза. Но если я вызываю эту функцию, она вызывается несколько раз. Я понимаю, что это какая-то проблема с асинхронным поведением Promise. Но как мне заставить его работать?

Предполагается добавить 1 параметр внутри ключа, но это приводит к добавлению более 1.

введите описание изображения здесь

Как заставить работать?

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