【问题标题】:How can I execute the SQL query first then the rest of the code?如何先执行 SQL 查询,然后执行其余代码?
【发布时间】:2018-05-25 15:11:44
【问题描述】:
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;
    }
  });
}

我创建了一个函数来为我提供数据库中的所有工作人员,然后将它们存储在 funclist 数组中。 问题是for 循环在查询之前运行。 如何仅在查询完成后运行循环?

【问题讨论】:

  • 我对 JS 不是很了解,但你不能使用 Promise 等待查询返回然后进入你的循环吗?
  • 我不太了解您的问题,我只看到一个查询(mysqlModule.queryDB(database, ...),而您问题中唯一的for 循环位于查询的就绪回调中。所以查询应该在for循环运行时完成。
  • 我已经解决了问题,我会在几分钟后发布答案。

标签: mysql node.js express


【解决方案1】:

将回调函数传递给 listFunc:

static listFunc(callback){...}

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

callback(funclist);

【讨论】:

    【解决方案2】:
    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() 返回假数据后才渲染玉。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      相关资源
      最近更新 更多