Query sincron in NodeJS

Hello devforum,
Am nevoie de un sfat cum as putea sa fac o functie sa ruleze sincron in NodeJS.

Exemplu/ mai mult pseudocod

//functie ce face un query  ==> As vrea sa ruleze sincron
function getUsers(){  
db.query('SELECT * FROM USERS').
  then.(function(results){
     return results;
   })
}

function altQuery(){
  db.query('SELECT * FROM AltTabel')
  .then(function(results){
     var users = getUsers();   // Eroare, nu s a terminat de executat prima functie( Nodejs e asincron)
  })
}

Cum pot realiza ce am de gand? Stiu, sunt multe librari ce te ajuta sa ti faci codul sincron, dar nu ma prind. Ma puteti ajuta cu un exemplu / sfat ? Mega thanks

Cred ca asta e ceea ce vrei:

function altQuery(){
  db.AltTabel.query('SELECT * FROM AltTabel')
  .then(function(results){
     return getUsers();
  })
  .then(function(users) {
    // do stuff
  });
}

getUsers() iti intoarce un promise, deci mai infigi un .then() mai jos.

1 Like

Am incercat si asa, nu merge.

Trebuie scapat de promise-uri, aici e buba.

Poate asta merge:

// Returns a Promise
function getUsers() {
  return db.query('SELECT * FROM Users');
}

// Returns a Promise
function altQuery() {
  return getUsers()
    .then((users) => {
      db.query('SELECT * FROM AltTabel')
        .then((altTabel) => {
          // do something with users and altTabel
        });
    });
}

Daca ai cum sa pui async/await din ES2017+ poti transforma codul radical:

async function work() {
  const users = await db.query('SELECT * FROM Users');
  const altTabel = await db.query('SELECT * FROM AltTabel');
  // do something with users and altTabel
}
2 Likes

Nope, faci tu ceva gresit. Uite exemplul tau facut cu setTimeout pentru a putea fi rulat in consola (Chrome DevTools).

function getUsers() {
  return new Promise((resolve, reject) => setTimeout(() => resolve(100), 1000));
}

function getAltTable() {
  return new Promise((resolve, reject) => setTimeout(() => resolve(200), 1000));
}

getUsers()
  .then((r1) => { 
    console.log('r1', r1);
    return getAltTable();
  })
  .then((r2) => {
    console.log('r2', r2);
  });

Nu sunt fan promises, dar asta nu inseamna ca nu functioneaza ok. Btw, codul de sus nu include error handling, trebuie adaugat si ala.

Eu recomand sa folosesti un ORM in cazul Javascript daca ai deaface cu mysql, la primele 2 proiecte am folosit mysql si inca imi repar greselile din trecut. E mult prea diferit JS fata de php/java si avem tendinta sa facem ceva total gresit.

http://vincit.github.io/objection.js/#getting-started

Nici sa nu va ganditi careva sa folositi ES7 mai devreme de 2017.

Scuze de off-topic, dar e prea de tot…
de-a face, de la de a face

1 Like