如何首先执行SQL查询然后执行其余代码?

时间:2018-05-25 15:11:45

标签: mysql node.js express

static listFunc() {

  let funclist = [];

  const queryList = "SELECT * FROM func";

  mysqlModule.queryDB(database, queryList, (err, result) => {
    console.log(result[0].id);

    if (err) {
      res.status(500).json({
        "status_code": 500,
        "status_message": "internal server error"
      });
    } else {
      for (var i = 0; i < result.length; i++) {
        let func = {

          'id': result[i].id,
          'psw': result[i].senha,
          'nome': result[i].nome,
          'DoB': result[i].dataNascimento,
          'sexo': result[i].genero,
          'morada': result[i].morada,
          'permissoes': result[i].permissoes
        }
        funclist.push(func);
      }

      return funclist;
    }
  });
}

我创建了一个函数,让我从DataBase中获取所有worker,然后将它们存储在funclist数组中。 问题是for循环在查询之前运行。 如何在查询完成后才能运行循环?

2 个答案:

答案 0 :(得分:0)

将回调函数传递给listFunc:

static listFunc(callback){...}

而不是返回列表只是调用回调:

callback(funclist);

答案 1 :(得分:0)

static listFunc() {

    return new Promise((resolve,reject)=>{
        let funclist = [];

                mysqlModule.queryDB(database,"SELECT * FROM func", (err, result) => {
                    if (err) throw err;

                    result.forEach((result) => {
                        let func = {
                            'id': result.id,
                            'psw': result.senha,
                            'nome': result.nome,
                            'DoB': result.dataNascimento,
                            'sexo': result.genero,
                            'morada': result.morada,
                            'permissoes': result.permissoes
                        }
                        funclist.push(func);

                    });  
                    resolve(funclist);    
                });
    });
}

首先我将“for”循环更改为“each”循环,我使用promise只在获得查询并完成循环后才给我数据。

function clistFunc(req, res){
Func.listFunc().then((data)=>{
        res.render('admin/adminListFunc', { funclist: data});
        console.log(data);
}).catch(()=>{
    console.log('Error');
});
}

然后我只是在listFunc()返回假装数据后才渲染玉石。