последовательное выполнение foreach l oop в базе - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть база данных реального времени от Firebase, где данные хранятся в виде отдельных строк, а не объектов. Проблема в том, что l oop исполняется наконец, где, как и прежде, его нужно запустить (я имею в виду последовательный). Он выходит из l oop без выполнения своих заданий.

exports.room_server = functions.database.ref(`/${Role.ROOM_REQUEST}/{room}`)
    .onCreate((snapshot,context)=>{

// her ref.once is refrence to another node of database
   ref.limttolast(3).once("value",function(snap){
       snap.forEach(function (usr) {
        adm = usr.val();
        console.log("admin " +  adm);
      });
      }).catch();
       
       console.log(" cl " + adm);
    });
//  cl undefined is shown first
// then it comes
// admin abc
// admin you
// admin me

   //result should be 
   //admin abc 
   //admin you
   //admin me
//cl me
  

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы получите этот вывод:

//  cl undefined is shown first
// then it comes
// admin abc
// admin you
// admin me

Поскольку once() является асинхронным, что означает, что он перейдет к другой задаче, прежде чем завершит извлечение данных, поэтому console.log(" cl " + adm); выполняется первым.

Вы можете сделать следующее:

ref.limitToLast(3).once("value").then((snapshot) => {
    snapshot.forEach((usr) => {
     adm = usr.val();
     console.log(" cl " + adm);
     console.log("admin " +  adm);
     });
 }).catch((e) =>{
    console.log(e);
 });

Метод then() возвращает Promise, он будет вызываться при выполнении или отклонении Promise.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

0 голосов
/ 05 мая 2020

Ответ, приведенный выше, также будет работать, но вот еще один способ сделать то же самое. Это будет почти то же самое.

   ref.limttolast(3).once("value").then((snapshot) => {
       
       snapshot.forEach((usr) => {
        adm = usr.val();
        console.log(" cl " + adm);
        console.log("admin " +  adm);
        }); // end of foreach loop
        
        return adm; 
        //return will wrap it as promise which will be fulfilled or rejected
        // return will send it to next .then() method 
    })
    .then( value_of_adm =>{
        // value_of_adm = adm
       console.log("cl" + value_of_adm);
    })
    .catch(
      // enter your code here
      // if u dont write code here no problem it will work fine
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...