【问题标题】:Can't return from a function无法从函数返回
【发布时间】:2019-10-23 04:44:41
【问题描述】:

所以我想做的是,创建一个函数,使用 mysql(不关心如何,但我为它找到了一个 npm,所以现在使用它。)从我的数据库中获取信息,然后提供我的 json用它。只要 console.log() 位于正确的位置,它就可以正常工作,但是我必须将其归还,因此我必须将其进一步向下移动。但是当我这样做时,它不会显示在我需要它的其他文件中。

我有两个基本相同的脚本,一个只是给另一个派系的。 - 所以我只展示一个,好像我找到了其中一个的解决方案,我对两个都有解决方案。

get_ally_online_players: function (guild) {

  con.query("SELECT * FROM user_dbs WHERE guild='"+ guild +"'", function (err, result, fields) {

    var con2 = mysql.createConnection({
        host: result[0].host,
        user: result[0].username,
        password: result[0].password,
        database: result[0].database
    })


    con2.connect()

    con2.query("SELECT * FROM characters WHERE online='1' AND race=1 OR race=3 OR race=4 OR race=7 OR race=11", function (err, result, fields) {
      allycount = 0
      console.dir(result)
      result.forEach(function(result) {
        allycount = allycount+1
      })
      return allycount

    });
    con2.end()
  });
}

这是我尝试拥有它的地方:

        if(recieved.content === "!status")
        {

            var horde_players
            var ally_players
            horde_players == guilddb.get_horde_online_players("585919060722712670")
            ally_players == guilddb.get_ally_online_players("585919060722712670")
            console.log(guilddb.test())
            //console.log(ally_players)
            recieved.channel.send(ally_players + " : " + horde_players)
        }

我已经尝试了很多东西......我还读到你必须使用回调,因为它显然太快了,就像它之前无法查询一样...... 不过,我想远离回调,因为在脚本中似乎很麻烦。但如果这是绝对必要的,那就这样吧。顺便说一句,它返回“未定义”。我也尝试过使用 Promise 并放置一个 setTimeout 函数等。

【问题讨论】:

  • 提示:不要使用x=1 OR x=2 OR x=3,而是使用x IN (1,2,3)。

标签: mysql node.js discord.js


【解决方案1】:

首先,对不起我的英语。

其实你犯了一些错误。

您在将值分配给 horde_players 和 ally_players 值时犯了错误

if (recieved.content === "!status") {
    var horde_players
    var ally_players
    horde_players = guilddb.get_horde_online_players("585919060722712670")
    ally_players = guilddb.get_ally_online_players("585919060722712670")
    console.log(guilddb.test())
    //console.log(ally_players)
    recieved.channel.send(ally_players + " : " + horde_players)
}

使用 (==) 您是在比较值,而不是设置。

现在让我们谈谈异步操作。

我准备了一个例子。这就像在您的情况下,您尝试运行两个可能在不同时间完成的异步操作,但您需要在运行其他操作之前完成它们。尝试运行它:

function async1(id, callback) {
    setTimeout(function() {
        callback('The user with ' + id + ' is called Sergio');
    }, 6000);
}

function async2(id, callback) {
    setTimeout(function() {
        callback('The user with ' + id + ' is called Jack');
    }, 2000);
}

var result1;
var result2;

async1(1, function(result) {
    result1 = result;
});

async2(2, function(result) {
    result2 = result;
});
console.log('Finished result: ' + result1 + result2); // Finished result: undefined undefined

完成的结果在完成两个异步操作之前运行。糟糕...

使用回调,我们需要嵌套函数(如果你不得不做更多的异步操作,你可能会导致回调地狱)

function async1(id, callback) {
    setTimeout(function() {
        callback('The user with ' + id + ' is called Sergio');
    }, 6000);
}

function async2(id, callback) {
    setTimeout(function() {
        callback('The user with ' + id + ' is called Jack');
    }, 2000);
}

var result1;
var result2;

async1(1, function(result) {
    result1 = result;

    async2(2, function(result) {
        result2 = result;
        console.log('Finished result: ' + result1 + result2); // 'Finished result: The user with 1 is called SergioThe user with 2 is called Jack
    });
});

对于您的情况,这将是我的解决方案。也许我会改进更多的东西,比如使用 const-let 和 ES6 特性(async-await、箭头函数......),传递 db 连接器 trought 参数......但也许现在你更容易理解了

var guilddb = {
    get_horde_online_players: function(guild, callback) {
        callback('Implement me!');
    },
    get_ally_online_players: function(guild, callback) {
        con.query("SELECT * FROM user_dbs WHERE guild='" + guild + "'", function (err, result, fields) {
            var con2 = mysql.createConnection({
                host: result[0].host,
                user: result[0].username,
                password: result[0].password,
                database: result[0].database
            });

            con2.connect();

            con2.query("SELECT * FROM characters WHERE online='1' AND race=1 OR race=3 OR race=4 OR race=7 OR race=11", function (err, result, fields) {
                var allycount = 0;
                console.dir(result);
                result.forEach(function(result) {
                    allycount = allycount+1
                });

                con2.end();
                callback(allycount);
            });
        });
    }
}

if (recieved.content === "!status") {
    guilddb.get_horde_online_players("585919060722712670", function(result) {
        var horde_players = result;

        guilddb.get_ally_online_players("585919060722712670", function(result) {
            var ally_players = result;
            console.log(guilddb.test());
            console.log(ally_players);
            recieved.channel.send(ally_players + " : " + horde_players);
        });
    });
}

希望对你有帮助。

【讨论】:

  • 另一件值得做的事情是折叠var 声明并分配到一行以使其更清晰。
【解决方案2】:

您的查询是异步的,因此该函数将在查询完成之前隐式返回 undefined。

因此,您将需要使用回调或承诺。

你可以像这样使用回调:

// Accept a callback function as an argument
get_ally_online_players: function (guild, callback) {

  con.query("SELECT * FROM user_dbs WHERE guild='"+ guild +"'", function (err, result, fields) {

    var con2 = mysql.createConnection({
      host: result[0].host,
      user: result[0].username,
      password: result[0].password,
      database: result[0].database
    })

    con2.connect()

    con2.query("SELECT * FROM characters WHERE online='1' AND race=1 OR race=3 OR race=4 OR race=7 OR race=11", function (err, result, fields) {
      allycount = 0
      console.dir(result)
      result.forEach(function(result) {
         allycount = allycount+1
      })

      // Pass the result to the callback function
      callback(allycount)
    })

    con2.end()
  })
}

...然后将回调函数传递给get_ally_online_players,它将在准备好时接收数据:

if (recieved.content === "!status") {
  var horde_players
  var ally_players
  horde_players = guilddb.get_horde_online_players("585919060722712670")

  // Pass a callback function that will receive the data when ready
  guilddb.get_ally_online_players("585919060722712670", function(ally_players) {
    console.log(ally_players)
    recieved.channel.send(ally_players + " : " + horde_players)
  })

}

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 2015-10-24
    • 2015-09-23
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2014-05-15
    • 2012-02-03
    相关资源
    最近更新 更多