node.js - node中MYSQL的异步问题
迷茫
迷茫 2017-04-17 16:32:45
0
1
709

我在用node查询数据库中使用如下代码:
var _password =mysql.query(table," where name = " + "'" + name + "'","password");
其中mysql.query为
query(table,others,column){

    var connection = this.connection;
    var sql;
    if(column) sql = "select " + column + " from " + table;
    else{sql = "select * from " + table;}
    if(others) sql += " " + others;
    console.log(sql);
    var result;
    connection.query(sql,function(err,rows,fields){
        if(err){
            throw err;
        }
        if(rows.length > 1){
            rows.forEach(function(row){
                console.log(row);
            });
        }
        else if(rows.length == 1){
            console.log(rows[0]);
            rows = rows[0];
        } 
        else{
            console.log("没有数据");
        }
        return rows;
    });
    console.log('result:');
    console.log(result);
    return result;
}

最终的结果是:

很显然query之后的语句先执行了,此处无法使用yield,请大神指教

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(1)
Peter_Zhu
rows.forEach(함수(행){
   console.log(행);
});

여기서 루프는 비동기식이므로 문제가 발생하면 비동기성을 제어해야 합니다.

예를 들어보겠습니다. 저는 글쓰기를 배운 지 얼마 안 되었지만, 비동기성을 제어하는 ​​방법을 보여드릴 수는 있습니다.

다음은 cc 모델의 참조입니다. 모두 기록하지는 않겠습니다.
  getGrades: 비동기() =>
    return new Promise((해결, 거부) => {
      db.pool.query('SELECT * FROM set_grades', 함수(err, 행) {
        if(행){
          해결(행);
        }
        또 다른{
          console.log(err);
          거부(err);
        }
      });
    });
  },

  getTerms: async (grade_id) =>
    return new Promise((해결, 거부) => {
      db.pool.query('SELECT * FROM set_terms WHERE grade_id = ?', grade_id,function (err, 행) {
        if(행){
          해결(행);
        }
        또 다른{
          console.log(err);
          거부(err);
        }
      });
    });
  },


//------------계약 생성-------------
imports.createContract = async (ctx, next)=>
  // 1 유형 가져오기
  유형 = new Array();
  cc.getTypes().then(결과 => {
    유형 = 결과;
  });

  // 2 고양이 얻기
  let cats = new Array();
  cc.getCats().then(결과 => {
    고양이 = 결과;
  });

  // 3 성적 얻기
  let grades = new Array();
  cc.getGrades().then(결과 => {
    성적 = 결과;
  });

  // 4 조건 가져오기
  // 각 등급을 순회한 후 다음 용어를 얻고 이를 등급으로 병합합니다.
  let forGrades = 비동기 함수(등급) {
    for(등급을 알려주세요){
      cc.getTerms(grade.grade_id).then(result => {
        grade.terms = 결과;
      });
    }
  }

  Wait forGrades(성적);

  ctx.render('cc/createContract',{를 기다립니다.
    title: '계약 생성',
    학생_ID: ctx.params.id,
    유형: 유형,
    고양이 : 고양이,
    성적: 성적
  })
}
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿