javascript - 从嵌套在函数中的函数返回数组并处理 promise 检查

标签 javascript node.js function

我正在使用 node.js 开发 Discord 机器人。这个想法相当简单,机器人会检查聊天消息中是否有某些短语,这些短语会触发它执行各种操作。主要与提供有关各种游戏服务器的信息有关。

我已经让机器人开始工作了,它完成了我想要它做的基本工作。

不过,我希望稍微扩展一下它的功能。

基本上,当人们输入“服务器 1v1”等特定术语时,机器人会向该服务器提供连接信息并查询服务器的当前状态。

我正在使用 npm package called gamedig to do this.

代码如下

//Query Minecraft Server
var serverInfo = function(chatTrigger){

//create an array of servers
//Name of the array arrays within the array is the chat trigger, the first value of each chat trigger array is the query mode for gamedir, second value is the IP or server query URL.
var namedServerArrays = {
    '1v1' : ["csgo","192.168.1.1",2016],
    '10man' : ["csgo","192.168.1.2",27017],
    'minecraft' : ["minecraft","192.168.1.3",2018]
}

//Convert named array data based on the chat triggers to a variable.
//This doesn't have to be done but gamedig gets a little pissy sometimes if you feed it straight arrays. No idea why.
var gameType = namedServerArrays[chatTrigger][0];
var gameHost = namedServerArrays[chatTrigger][1];
var gamePort = namedServerArrays[chatTrigger][2];

//Query server based on chatTrigger input.
Gamedig.query({
        type: gameType,
        host: gameHost,
        port: gamePort
    },
function(e,state) {
        if(e){
            console.log("Server is offline");
            return "Server connection error.";
        }else{
            var playersOnline = state.players.length;
            var currentMap = state.map;

                //Vomit a bunch of error checking.
                console.log("The " + chatTrigger + " server is online.");
                console.log("Players Online: " + playersOnline);
                console.log("Server map: " + currentMap);
                console.log("User was given " + chatTrigger +" server connection information.");

                return [playersOnline,currentMap];
        }
});
//End Query 

var queryReturnState = Gamedig.query();}

我所关心的是如何将数据从 gamedig 查询函数返回到 serverInfo 函数,以便服务器信息函数可以将其返回到使用 serverInfo 函数的任何地方?

在当前状态下,控制台会正确记录所有最新的相关数据,但最终会遇到 UnhandledPromiseRejectionWarming。

( Node :1479)UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝 ID:1):TypeError:无法设置未定义的属性“回调” ( Node :1479)DeprecationWarning:未处理的 promise 拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。

我在理解如何处理 Node.js 中的 Promise 时也遇到了一些困难。

任何帮助我让它发挥作用并更好地理解的帮助都是值得赞赏的。

最佳答案

这看起来像是底层库中的错误或库的使用问题。尝试使用 promise API这至少会捕获错误,并且可能避免在底层 gamedig 库中使用回调。

使用 Promise API 时,您所需要做的就是从函数中返回一个值或一个值的 Promise。

无论您在何处调用 serverInfo(),都使用 .then 来处理异步 Promise 结果,然后将其发送到聊天,无论是什么。

serverInfo(blah).then(function(result){
   chat.send(result)
})

promise 代码

// Query Minecraft Server
var serverInfo = function(chatTrigger){
  var namedServerArrays = {
    '1v1' : ["csgo","192.168.1.1",2016],
    '10man' : ["csgo","192.168.1.2",27017],
    'minecraft' : ["minecraft","192.168.1.3",2018]
  }

  // Convert named array data based on the chat triggers to a variable.
  // This doesn't have to be done but gamedig gets a little pissy sometimes if you feed it straight arrays. No idea why.
  var gameType = namedServerArrays[chatTrigger][0];
  var gameHost = namedServerArrays[chatTrigger][1];
  var gamePort = namedServerArrays[chatTrigger][2];

  //Query server based on chatTrigger input.
  return Gamedig.query({
        type: gameType,
        host: gameHost,
        port: gamePort
    })
    .then(function(state){
        var playersOnline = state.players.length;
        var currentMap = state.map;

        //Vomit a bunch of error checking.
        console.log("The " + chatTrigger + " server is online.");
        console.log("Players Online: " + playersOnline);
        console.log("Server map: " + currentMap);
        console.log("User was given " + chatTrigger +" server connection information.");

        return [playersOnline,currentMap];
    })
    .catch(function(error){
        console.error(error);
        return 'Server connection error';
    });
}

关于javascript - 从嵌套在函数中的函数返回数组并处理 promise 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43195627/

相关文章:

javascript - 返回 Bool 到 AJAX 请求

JavaScript 将元素另存为图像或 Extjs 4.x 另存为图像

javascript - 使用 Mixpanel JQL 访问 .filter() 范围内的变量

javascript - 连接在收到握手响应之前关闭

c - 检查2个数组是否具有相同元素的递归方法

javascript - JS : Confused on how to make a function return it's parameters concatenated

javascript - 对象 IE7 中的预期错误 - 函数范围有问题?

javascript - 在 JavaScript 中为应用程序分配多个方法

node.js - RobuSTLy 检索哪个字段在 Mongo 中导致 'duplicate key error'

javascript - Mongoose - find() 在没有传递参数时不返回任何内容,但在传递参数时返回数据