Я пытаюсь создать простую текстовую игру, которая работает в чате socket.io на сервере узлов.Программа работает следующим образом:
В настоящее время у меня есть три основных модуля
Rogue: базовый дом функций мошеннических игр
rogueParser: модуль, отвечающий за извлечение выполнимых команд из командных строк
Verb_library: модуль, содержащий список команд, которые могут быть вызваны из клиентского терминала.
Клиент вводит команду типа «поздоровайся с миром».Это запускает следующий слушатель socket.io
socket.on('rg_command', function(command){
// execute the verb
let verb = rogueParser(command);
rogue.executeVerb(verb, command, function(result){
console.log(result);
});
});
, который, в свою очередь, вызывает функцию executeVerb от мошенника.
executeVerb: function(verb, data, callback){
verb_library[verb](data, callback);
},
Каждый глагол в verb_library должен отвечать за манипулирование базой данных -если требуется - и затем возвращает строку эха, отправленную соответствующим целям, представляющим завершение действия.
РЕДАКТИРОВАТЬ: я выбрал «сказать», когда я опубликовал это, но впоследствии было отмечено, что это был плохой пример.«say» в настоящее время не асинхронен, но в конечном итоге будет таким же, как и подавляющее большинство «глаголов», поскольку им нужно будет выполнять вызовы в базу данных.
...
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) Я не уверен, что я делаю это сложнее, чем нужно, не используя обещания, или это полностью достижимо с помощью обратных вызовов, и в этом случае я хочу узнать, как сделать это таким образом, прежде чем вызыватьдополнительный код
Извините, если это расплывчатый вопрос, я нахожусь в положении сомнений в шаблоне проектирования и ищу советы по этой общей настройке, а также конкретную информацию о том, как эти обратные вызовы должны передаваться.Спасибо!