javascript - 异步挫折 : Should I be using callbacks and how do I pass them through multiple modules?

标签 javascript node.js asynchronous socket.io

我正在尝试制作一个简单的文本游戏,该游戏在 Node 服务器上的 socket.io 聊天室中运行。该程序的工作原理如下:

目前我有三个主要模块

Rogue:Rogue游戏功能的基本主页

rogueParser:负责从命令字符串中提取可用命令的模块

Verb_library:包含可以从客户端调用的命令列表的模块。

客户端输入类似“say hello world”的命令。这会触发以下 socket.io 监听器

socket.on('rg_command', function(command){
  // execute the verb
  let verb = rogueParser(command);
  rogue.executeVerb(verb, command, function(result){
    console.log(result);
  });
});

然后依次调用 rogue 的executeVerb 函数..

  executeVerb: function(verb, data, callback){
    verb_library[verb](data, callback);
  },

verb_library 中的每个动词都应负责操作数据库(如果需要),然后返回发送到相应目标的回显字符串,表示操作已完成。

编辑:当我发布此内容时,我选择了“说”,但后来有人指出这是一个糟糕的例子。 “say”目前不是异步的,但最终将像绝大多数“verbs”一样,因为它们需要调用数据库。

...
  say: function(data, callback){
    var response = {};
    console.log('USR:'+data.user);
    var message = data.message.replace('say','');
    message = ('you say '+'"'+message.trim()+'"');
    response.target = data.user;
    response.type = 'echo';
    response.message = message;
    callback(response);
  },
...

我的问题是

1 ) 我在通过如此多的模块传递回调时遇到问题。我应该能够通过多层模块传递回调吗?我担心我是盲目的,所以一些作用域魔法让我失去了当我将回调函数传递到模块中时应该发生的情况,然后将相同的回调传递给另一个模块,然后调用回调。目前看来,我要么最终无法访问回调,要么第一个函数尝试执行而不等待最终回调返回空值。

2)我不确定我是否通过不使用 promise 而使这变得比需要的更困难,或者这是否完全可以通过回调来实现,在这种情况下,我想在调用额外的代码之前学习如何做到这一点。

抱歉,如果这是一个模糊的问题,我对设计模式有疑问,并正在寻找有关此一般设置的建议以及有关如何传递这些回调的具体信息。谢谢!

最佳答案

1)通过多个层传递回调听起来不是一个好主意。通常我会想,如果我继续这样做一年会发生什么?它是否足够灵活,以便当我需要更改架构时(假设客户有新想法),我的代码将允许我无需重写整个应用程序?你所经历的就是所谓的回调 hell 。 http://callbackhell.com/ 我们正在尝试做的就是让我们的代码尽可能浅。

2) Promise 只是回调的语法糖。但在 Promise 中思考比在回调中思考要容易得多。因此,就我个人而言,我建议您在项目期间花些时间并尽可能多地掌握编程语言功能。我们执行异步代码的最新方法是使用 async/await 语法,它允许我们完全摆脱回调和 Promise 调用。但在您的道路上,您肯定必须同时使用两者。

你可以尝试以这种方式完成你的代码,当你完成后,找出最大的痛苦是什么,以及如何再次编写它以避免将来再次出现这种情况。我向你保证,这比在这里得到明确的回答更有教育意义:)

关于javascript - 异步挫折 : Should I be using callbacks and how do I pass them through multiple modules?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53485997/

相关文章:

javascript - 在提交数据之前更改选择表单元素中的值

c# - Task.Delay 是如何工作的?

c# - 在 LINQ 语句中使用 async/await 时实际发生了什么?

c# - 如何正确地异步编写 Socket/NetworkStream?

javascript - 使用javascript在两个aspx页面之间传递数据

javascript - Ajax总是返回0

javascript - Sails js 中的文件名生成器

node.js - 错误 : Can't set headers after they are sent. Express.js

javascript - 如何让用户添加带有必填字段的对象?

javascript - 如何从nodejs检查Redis缓存连接状态