for循环中的异步函数javascript

时间:2019-10-18 19:07:41

标签: javascript node.js asynchronous

我对异步函数没有经验,我想在for循环中执行请求。这是我的代码:

app.route('/friendlist').post((req, res) => {
  var body = req.body;
  var list = "";

  con.query(`SELECT * FROM player_friends WHERE main_user_id = '${body.player_id}'`, (err, row, fields) => {
    if (err) throw err;

    async function queryOutUserData(data) {
      var rows = await new Promise((resolve, reject) => {
        con.query(`SELECT * FROM players WHERE player_id = '${data.player_id}'`, (error, player, field) => {
          if (error) {
            console.log(error);
            return reject(error);
          }

          resolve(player);
        });
      });

      rows.then(message => {
        return message
      });
    }

    for (var i = 0; i <= row.length; i++) {
      console.log(row[i].main_user_id);
      var result = await queryOutUserData(row[i]);
      list = list + ";" + result[0].player_id + ":" + result[0].player_username;
    }
    console.log(list);
    return list;
  });
});

实际上,这是个完整的问题:我进行了一些调试,并在承诺被解决之前在for循环中显然增加了i的值。另外,正如我提到的那样,我对异步函数不熟悉,您能为我提供有关Promise和异步函数如何工作的描述性资源吗?

谢谢

注意:为获得更好的缩进效果,请使用以下代码:https://hastebin.com/fovayucodi.js

3 个答案:

答案 0 :(得分:0)

我建议不要使用async/await,而是使用WHERE IN在一个查询中进行所有操作,而不是每个玩家一个查询。查看以下内容是否满足您的需求:

app.route('/friendlist').post((req,res) => {
    var body = req.body;
    var list = "";

    con.query(`SELECT * FROM player_friends WHERE main_user_id = '${body.player_id}'`, (err, row, fields) => {
      if (err) throw err;

      const playerIds = row.map(player => player.player_id);

      con.query(`SELECT * FROM players WHERE player_id IN ${playerIds}`, (error, players, field) => {
        for (let player of players) {
            list += `;${player.player_id}:${player.player_username}`;
        }
      });

      console.log(list);
      return list;

    });

  });

答案 1 :(得分:-1)

如果您await做出承诺,则评估结果为该承诺的结果,因此rows不是承诺,它是结果 。所以这个:

 rows.then(message => {return message});

没有什么意义,只要做:

 return message;

此外,您在常规函数中有一个await,这就是语法错误。

此外,return list;并没有做很多事情(如果是明确的话),您可能想要return res.json({ list });

  

:我进行了一些调试,显然在答应被解决之前,for循环中的i会增加。

我怀疑是否由于语法错误而无法实际运行代码,就可以调试代码。

答案 2 :(得分:-1)

尝试使用for-of而不是for。

类似这样:

异步功能:

async function test() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(true);
            return
        }, 1000)
    })
}

这是另一个用于等待循环结束的函数

async function myFunction() {
    const data = [1,2,3,4,5,6,7,8]

    for(let i of data) {
        const value = await test();
        console.log(value)
    }

    console.log("finish");
}