выполнять asyn c функций в фиксированном порядке javascript - PullRequest
0 голосов
/ 09 июля 2020

У меня есть 3 функции , и я хочу выполнять их в фиксированном порядке (f1, f2, f3) . Я пробовал asyn c await и обещания, первый подход не сработал, а второй я не понял, наверное.

Первая функция подталкивает локальные пути к массиву с именем 'jsons' , вторая функция отправляет данные из путей в массив с именем 'profile', а третья функция отправляет массив 'profile' по URL-адресу. Я знаю, что это может быть не самый безопасный способ, но это всего лишь небольшой проект, чтобы лучше понять js.

function visualroute() { 

  const jsons = [];
  const profile = [];

  router.get('/user', verify, async (req, res) => {//here i want the data to be sent to
    
    //Push array jsons
    const checker = async function (){
      sqldb.query(`SELECT * FROM ${username}`, (error, result) =>{
      console.log('1');
        if(error) {
          console.log(error);
        }
        if( result.length == 0 ) {
          console.log('User does not have initiated a db yet');
          return res.render('user/index', {
            message: 'No data added to db yet'
          });
        } else {
          try{        
            //for loop to push the required info into jsons[]
            for(i=0; i<result.length; i++){
              jsons.push(`../public/jsonsheets/${result[i].infoticker}.json`);
            }
            console.log(jsons);
          } catch(err){
            throw err;
          } 
        };//else end
      });//checker end
    }

    //push array profile
    const jsonreader = async function() {
      console.log('2');
      for(i=0; i<jsons.lenght; i++){
        //Check if path exists
        try {
          fs.access(`public/jsonsheets/${jsons[i]}`, fs.F_OK, (err) => {
            if (err) {
              console.log('Does not exist');
              return
            }
            console.log('Exists');

            //exists: read it into profile[]
            fs.readFile(`public/jsonsheets/${jsons[i]}`, (err, data) => {
              if (err) throw err;
              let userdata = JSON.parse(data);

              profile.push(userdata);
              
            });
          })
        } catch(err) {
          console.log(err)
        }
      }//for loop end
      
      console.log(profile);
    }

    // send data to url
    const finalsender = async function() {
      console.log('3');
      res.send(
        profile
      );
    }  
    
    async function quefunction(){
      await checker();
      await jsonreader();
      await finalsender();
    }

    quefunction();
    
  }); //route end
}; //visualroute end

visualroute();

мой результат: 2, 3, 1 и так далее пустой массив на адрес получателя.

1 Ответ

0 голосов
/ 09 июля 2020

Как сказал Крис, первая и вторая функции должны возвращать обещание. потому что их тело содержит функцию asyn c (например, db.query и fs.access), и единственный способ вернуть результат (установить результат) в функции asyn c - это вызвать resolve ().

см. ниже.

const jsons = [];
const profile = [];

router.get('/user', verify, async (req, res) => {//here i want the data to be sent to
  
  //Push array jsons
  const checker = async function (){
    return new Promise((resolve, reject) => { // return Promise
        sqldb.query(`SELECT * FROM ${username}`, (error, result) =>{
            // console.log('1');
              if(error) {
                console.log(error);
                reject(error); // reject here to quit processing
              }
              if( result.length == 0 ) {
                console.log('User does not have initiated a db yet');
                res.render('user/index', {
                  message: 'No data added to db yet'
                });
                reject('no user invited'); // no need to process more
              } else {
                try{        
                  //for loop to push the required info into jsons[]
                  for(i=0; i<result.length; i++){
                    jsons.push(`../public/jsonsheets/${result[i].infoticker}.json`);
                  }
                  console.log(jsons);
                  console.log(1)
                  resolve(); // resolve and then next function call starts.
                } catch(err){
                  //throw err;
                  reject(err);
                } 
              };//else end
            });//checker end
    })

  }

  //push array profile
  const jsonreader = async function() {
    return new Promise((resolve, reject) => {
        console.log('2');
        for(i=0; i<jsons.lenght; i++){
          //Check if path exists
          try {
            fs.access(`public/jsonsheets/${jsons[i]}`, fs.F_OK, (err) => {
              if (err) {
                console.log('Does not exist');
                reject(err);
              }
              console.log('Exists');
  
              //exists: read it into profile[]
              fs.readFile(`public/jsonsheets/${jsons[i]}`, (err, data) => {
                if (err) throw err;
                let userdata = JSON.parse(data);
                profile.push(userdata);
                resolve();                    
              });
            })
          } catch(err) {
            console.log(err)
            reject(err)
          }
        }//for loop end
    })        
  }

  // send data to url
  const finalsender = async function() {
    console.log('3');
    res.send(
      profile
    );
  }  
  
  async function quefunction(){
    try {
        await checker();
        await jsonreader();
        await finalsender();
    } catch(err) {
        // all reject function call will jump to here
        console.error(err);
    }

  }

  quefunction();
  
 }); //route end
}; //visualroute end

visualroute();
...