JavaScript - Как запустить эти две функции Firebase в последовательности? - PullRequest
0 голосов
/ 31 октября 2019

Я хочу запустить две нижеприведенные функции JS Firebase синхронно, так как для выполнения операции мне нужны значения из обоих из них в последнем блоке if. У меня есть console.log(1), (2) and (3), чтобы увидеть, работают ли они синхронно, но это не так. Я попробовал .then() на первом блоке, но это не сработало. Может кто-нибудь помочь здесь? Я предполагаю, что promise может работать здесь, но я не знаю, как это реализовать: (

let intUsersRef = db.ref('users/' + this.user_id + '/interested_in');
let waitUsersRef = db.ref('users/' + this.user_id + '/waitlist_in');

//block 1
          intUsersRef.orderByChild('project_id')
            .equalTo(id).on('value', function(snapshot){
              console.log(1);
              if(snapshot.val() == null){
                //project not in interested node
                userInterested = false;
              }else{
                userInterested = true;
              }
          });

//block 2        
          waitUsersRef.orderByChild('project_id')
            .equalTo(id).on('value', function(snapshot){
              console.log(2);
              if(snapshot.val() == null){
                //project not in waitlist node
                userWaitlisted = false;
              }else{
                userWaitlisted = true;
              }
          });
//block 3
          if(userInterested == true || userWaitlisted == true){
            console.log(3);
            //do something...
          }```

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

До введения синтаксиса "ожидание" в 2017 году вы могли достичь того же результата, что и ответ @ anonystyick , используя следующий код, который использует Promise.all():

let intUsersRef = db.ref('users/' + this.user_id + '/interested_in');
let waitUsersRef = db.ref('users/' + this.user_id + '/waitlist_in');

Promise.all([
  intUsersRef.orderByChild('project_id').equalTo(id).once('value').then(snapshot => snapshot.hasChildren()), // returns true if entries are found
  waitUsersRef.orderByChild('project_id').equalTo(id).once('value').then(snapshot => snapshot.hasChildren()) // returns true if entries are found
]).then((results) => {
  if(results[0] /* userInterested */ && results[1] /* userWaitlisted */ ) {
    // user is both interested and waitlisted
    // do something
  } else {
    // do something else
  }
}).catch((err) => {
  // something went wrong (bad permissions, no internet, etc.)
  // handle error
});

Примечание: это действительно для ES6 / ECMAScript 2015

0 голосов
/ 31 октября 2019
let intUsersRef = db.ref('users/' + this.user_id + '/interested_in');
let waitUsersRef = db.ref('users/' + this.user_id + '/waitlist_in');
//get snaps intUsersRef before
const _intUsersRef = await intUsersRef.orderByChild(filter).once('value');
//when intUsersRef has return then get _waitUsersRef
const _waitUsersRef = await waitUsersRef.orderByChild(filter).once('value');

//finally compare 
if (_intUsersRef || _waitUsersRef) {
    //do something...
} s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...