Javascript 正在等待mysql数据库查询完成,然后继续

Javascript 正在等待mysql数据库查询完成,然后继续,javascript,mysql,node.js,Javascript,Mysql,Node.js,我遇到了一个问题,我想在继续之前等待异步数据库查询及其操作 我当然可以将操作放在金字塔中,但从长远来看,这并不酷,因为有时我必须复制代码 下面是我的示例(由于数据库查询上的异步,这在当前当然不起作用): var级别=5; var难度=30//例子 让randomDecider=Math.floor(Math.random()*(50+级别)+1); if(难度50){ type=“技能”; var ownedSkills=[]; var skillsKeys=Object.keys(技能); d

我遇到了一个问题,我想在继续之前等待异步数据库查询及其操作

我当然可以将操作放在金字塔中,但从长远来看,这并不酷,因为有时我必须复制代码

下面是我的示例(由于数据库查询上的异步,这在当前当然不起作用):

var级别=5;
var难度=30//例子
让randomDecider=Math.floor(Math.random()*(50+级别)+1);
if(难度<随机决策者){
var类型;
变量名;
var海洛因=”;
dbconn.query(“从用户=?和装备=1的用户中选择*,[req.session.login],函数(错误、结果、字段){
海洛因=结果[0]。海洛因;
});
如果(随机决策器>50){
type=“技能”;
var ownedSkills=[];
var skillsKeys=Object.keys(技能);
dbconn.query(“从用户=?和英雄=?和装备=1的所有技能中选择*,[req.session.login,英雄],函数(错误,结果,字段){
对于(变量i=0;i
因此,有人可以在此基础上解释我如何将其转换为工作状态,比如在查询完成后等待操作,然后再继续。 我尝试了async/await,但目前无法理解

此外,我们也非常欢迎对本规范提出任何其他建议。

谢谢。

我已经在评论中解释了如何使用
Promise
s。我假设您正在为NodeJS程序使用
mysql

因此,首先,为了避免金字塔(或者我们通常称之为回调地狱),我们可以尝试将异步函数包装成一个
Promise
,如下所示:

function queryPromise(str, params) { 
  return new Promise((resolve, reject) => {
    dbconn.query(str, params, (err, result, fields) => {
      if (err) reject(err); 
      resolve(result);
    })
  })
}
然后,我只承诺了重要的部分:

var level = 5;
var difficulty = 30; //example
let randomDecider = Math.floor(Math.random() * (50 + level) + 1);
if (difficulty < randomDecider) {
  var type;
  var name;
  var heroid = "";

  queryPromise("SELECT * FROM owned_heroes WHERE user = ? AND equipped = 1", [req.session.login]).then(result => {
    heroid = result[0].heroid;
    if (randomDecider > 50) {
      ........
现在看起来好多了,不是吗?正如关键字所示,
await
使您的代码等待从查询中检索结果。只是别忘了将整个代码包装到一个
async函数()
块中,因为
await
不允许在
async
函数之外

async function myfunc() {
  var level 5;
  ....
我建议您研究一些库,例如
mysql2/promise
甚至
sequelize
,当您对承诺感到满意时,这些库会使用承诺(或者更好,与async await一起使用)


我希望这会有所帮助。祝你好运!

我在评论中解释了如何使用
Promise
s。我假设你正在使用
mysql
库来开发你的NodeJS程序

因此,首先,为了避免金字塔(或者我们通常称之为回调地狱),我们可以尝试将异步函数包装成一个
Promise
,如下所示:

function queryPromise(str, params) { 
  return new Promise((resolve, reject) => {
    dbconn.query(str, params, (err, result, fields) => {
      if (err) reject(err); 
      resolve(result);
    })
  })
}
然后,我只承诺了重要的部分:

var level = 5;
var difficulty = 30; //example
let randomDecider = Math.floor(Math.random() * (50 + level) + 1);
if (difficulty < randomDecider) {
  var type;
  var name;
  var heroid = "";

  queryPromise("SELECT * FROM owned_heroes WHERE user = ? AND equipped = 1", [req.session.login]).then(result => {
    heroid = result[0].heroid;
    if (randomDecider > 50) {
      ........
现在看起来好多了,不是吗?正如关键字所示,
await
使您的代码等待从查询中检索结果。只是别忘了将整个代码包装到一个
async函数()
块中,因为
await
不允许在
async
函数之外

async function myfunc() {
  var level 5;
  ....
我建议您研究一些库,例如
mysql2/promise
甚至
sequelize
,当您对承诺感到满意时,这些库会使用承诺(或者更好,与async await一起使用)


我希望这会有所帮助。祝你好运!

去阅读一下
Promise
s。它可以让你在解决问题时避免回调金字塔地狱。你可以尝试将查询函数包装成Promises。@Imizer你能给我举个例子说明如何包装查询函数吗?就一个查询函数,我会非常感激您可以尝试这种代码:
函数q(str,params){returnnewpromise((resolve,reject)=>{dbconn.query(str,params,(err,result,fields)=>{if(err)reject(err);resolve(result)}
。如果您不介意再等一点,我已经用这个方法得出了一个答案。@ionizer是的,如果您愿意,我当然可以等待答案,但我想我知道您的意思,可以让它工作,但我仍然会等待一个简洁的版本。:)我已经发布了一个答案,您可以选择任何一种方法。您使用的是哪个版本的Nodew?去阅读一下
Promise
s。它可以让你在解决问题时避免回调金字塔地狱。你可以尝试将查询函数包装成Promises。@Imizer,你能给我一个如何包装查询函数的例子吗?就一个查询函数,我将非常感激。你可以尝试这种代码:
函数q(str,params){返回新承诺((解析,拒绝)=>{dbconn.query(str,params,(err,result,fields)=>{if(err)reject(err);resolve(result)}}
。如果您不介意再等一点,我已经用这个方法得出了一个答案。@ionizer是的,如果您愿意,我当然可以等待答案,但我想我知道您的意思,可以让它工作,但我仍然会等待一个简洁的版本。:)我已经发布了一个答案,您可以选择任何一种方法。您使用的是哪个版本的Nodew?一个问题,如果我将“myfunc()”设为异步,那么我如何等待它的返回调用,因为我是这样做的:
var squareweb=myfunc();
然后使用squareweb变量,这样myfunc()就不能真正异步了。我必须是crea吗