如何使代码异步?

时间:2018-05-26 15:22:06

标签: javascript mysql node.js

好吧,所以我有一个调用MySQL数据库的函数,获取一些信息并用它来做任务。然后它应该比较它。该函数是异步的,但问题是调用MySQL数据库的部分在For循环中,当我尝试await时,它表示" await仅在异步函数中有效&#34 ;

async function savePosition(con) {
    let IDs = [];
    let finished = false;
    con.query(`SELECT * FROM Callers;`, (err, callers) => {

        if (err) throw err;

        if (callers.length < 1) throw 'No callers';

        for (let i = 0; i < callers.length; i++) {
            let maxCalls = -1;
            let maxID = "";
            let maxLast = "";

            for (let j = 0; j < callers.length; j++) {
                const uID = callers[j].id;

                let isWritten = false;
                for (let a = 0; a < IDs.length; a++) {
                    if (uID == IDs[a]) isWritten = true;
                }

                if (isWritten) continue;

                con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
                    if (e) throw e;
                    if (Number(curr[0].calls) > maxCalls) {
                        maxID = curr[0].id;
                        console.log(maxID)
                        maxCalls = curr[0].calls;
                    }
                })
            }

            IDs[i] = maxID;
            console.log("maxid" + maxID);
            con.query(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
        }
    })
}

从以下代码中,输出为:

maxid
some id

正如我所说,如果我将await放在con.query()行中,则会出现错误&#34; Await仅在异步函数&#34;中有效。我怎样才能解决这个问题?我希望它首先定义maxID,然后在控制台中将其写入

完整错误是:

C:\...\Sentry\cmds\setkills.js:33
         await con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
         ^^^^^

SyntaxError: await is only valid in async function
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at jsFiles.forEach (C:\...\Sentry\bot.js:93:20)

bot.js第93行:

let properties = require(`./cmds/${file}`);

第92行:

jsFiles.forEach((file) => {

编辑:包含完整功能。

2 个答案:

答案 0 :(得分:1)

我已经使用了承诺然后实现了这一目标。

var Promise = require('promise');
....
function savePosition(con) {
  let getMaxId = ()=>{
      return new Promise((resolve,reject)=>{
          let maxID;
          let counter=callers.length-1;
          for (let i = 0; i < callers.length; i++) {

            con.query(`SELECT * FROM Callers WHERE id = '${uID}';`, (e, curr) => {
              if (e)
                throw e;
              if (Number(curr[0].calls) > maxCalls) {
                maxID = 'some id';
                maxCalls = curr[0].calls;
              }
               if(counter===0) resolve(maxID);
               else couonter--;
            })

          }
      })
  }

  getMaxId().then((maxID)=>{
      IDs[i] = maxID;
      console.log("maxid" + maxID);
      con.query(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
  })
}

答案 1 :(得分:1)

以下是使用promises和async/await的最新代码版本,以允许您使用与异步查询一起使用的更多同步编码样式:

const util = require('util');

async function savePosition(con) {
    con.queryPromise = util.promisify(con.query);
    let IDs = [];
    let finished = false;
    let callers = await con.queryPromise(`SELECT * FROM Callers;`);

    if (callers.length < 1) throw new Error('No callers');

    for (let i = 0; i < callers.length; i++) {
        let maxCalls = -1;
        let maxID = "";
        let maxLast = "";

        for (let j = 0; j < callers.length; j++) {
            const uID = callers[j].id;

            let isWritten = false;
            for (let a = 0; a < IDs.length; a++) {
                if (uID == IDs[a]) isWritten = true;
            }

            if (isWritten) continue;

            let curr = await con.queryPromise(`SELECT * FROM Callers WHERE id = '${uID}';`);
            if (Number(curr[0].calls) > maxCalls) {
                maxID = curr[0].id;
                console.log(maxID)
                maxCalls = curr[0].calls;
            }
        }

        IDs[i] = maxID;
        console.log("maxid" + maxID);
        await con.queryPromise(`UPDATE Callers SET position = ${i + 1} WHERE id = '${maxID}';`);
    }
}

你会这样称呼:

savePosition(con).then(() => {
    console.log("savePosition() completed successfully");
}).catch(err => {
    console.log("Error in savePosition(), err);
});