Javascript 如何向游戏协调员发送多个请求?

Javascript 如何向游戏协调员发送多个请求?,javascript,node.js,Javascript,Node.js,我正在使用节点globaloffensive库,希望向gc发送多个请求,以从数据库中的每个用户处获取每个排名。用我当前的代码,它会重复一遍,而我只收到一个请求。你知道我如何发送和接收每个个人资料吗 我当前的代码: const SteamUser = require('steam-user'); const SteamTotp = require('steam-totp'); const GlobalOffensive = require('globaloffensive'); const con

我正在使用节点globaloffensive库,希望向gc发送多个请求,以从数据库中的每个用户处获取每个排名。用我当前的代码,它会重复一遍,而我只收到一个请求。你知道我如何发送和接收每个个人资料吗

我当前的代码:

const SteamUser = require('steam-user');
const SteamTotp = require('steam-totp');
const GlobalOffensive = require('globaloffensive');
const config = require('./config');
const db = require('./database');

var SteamID = require('steamid');
var mysql = require('mysql');

let user = new SteamUser();
let csgo = new GlobalOffensive(user);

csgo.on('debug', console.log);
user.on('error', console.error);

var pool  = mysql.createPool({
  supportBigNumbers: true,
  bigNumberStrings: true,
  connectionLimit: 10,
  host: db.host,
  user: db.user,
  password: db.password,
  database: db.dbname
});

const logInOptions = {
  accountName: config.accountName,
  password: config.password
}

user.logOn(logInOptions);

user.on('loggedOn', res => {
  console.log("Logged into Steam as " + user.steamID.getSteam3RenderedID());

  user.setPersona(SteamUser.EPersonaState.Online);
  user.gamesPlayed(730);

});

csgo.on("connectedToGC", function() {
    console.log("connectedToGC");
    const checkData = setInterval(()=>{

    //Check connection to game coordinator
    if ( csgo.haveGCSession ) {

      //Check Database
      pool.getConnection(function(err, connection) {
        if (err) throw err;
        connection.query("SELECT * FROM Users WHERE (MainSteamGroup = '1' || CommunitySteamGroup = '1' || vip = '1') && BotInFriendlist = '1'", function (err, rows, fields) {
          connection.release();
          if (err) throw err;
          rows.forEach( (row) => {
            var account_id = new SteamID(`${row.SteamID64}`);

            //Request Data from CS:GO
            csgo.requestPlayersProfile(account_id, function(data) {
                console.log(data);
                console.log("before");
                setTimeout(function(){
                    //do what you need here
                }, 2000);
                console.log("after");
            });
          });
        });
      });
    };
  }, 10000);
});
日志:


这里有几个问题-

  • forEach
    中的回调类型函数的工作方式与您期望的不一样。使用
    Promise.all
    for..of

  • mssql
    支持promise,因此无需使用回调样式使事情变得复杂和难以阅读

  • 将回调样式转换为promise

我已经修改了代码。它看起来像这样

function getRequestPlayer(account_id) {
  return new Promise((resolve, reject) => {
    csgo.requestPlayersProfile(account_id, function (data) {
      console.log(data);
      resolve(data);
    });
  });
}

csgo.on("connectedToGC", async function () {
  console.log("connectedToGC");
  // Check connection to game coordinator
  if (csgo.haveGCSession) {

    // Check Database
    const connection = await pool.getConnection();
    const rows = await connection.query("SELECT * FROM Users WHERE (MainSteamGroup = '1' || CommunitySteamGroup = '1' || vip = '1') && BotInFriendlist = '1'");
    await Promise.all(rows.map(row => {
      const account_id = new SteamID(`${row.SteamID64}`);
      return getRequestPlayer(account_id);
    }));
  }
});

你可能需要在这里和那里调整一些事情,但你会得到一个想法。希望这有帮助

我已经试过了,但是设置间隔不起作用。如果不使用setInterval,则会出现以下错误:
function getRequestPlayer(account_id) {
  return new Promise((resolve, reject) => {
    csgo.requestPlayersProfile(account_id, function (data) {
      console.log(data);
      resolve(data);
    });
  });
}

csgo.on("connectedToGC", async function () {
  console.log("connectedToGC");
  // Check connection to game coordinator
  if (csgo.haveGCSession) {

    // Check Database
    const connection = await pool.getConnection();
    const rows = await connection.query("SELECT * FROM Users WHERE (MainSteamGroup = '1' || CommunitySteamGroup = '1' || vip = '1') && BotInFriendlist = '1'");
    await Promise.all(rows.map(row => {
      const account_id = new SteamID(`${row.SteamID64}`);
      return getRequestPlayer(account_id);
    }));
  }
});