Возникла проблема в решении задачи из codeWars. Сперва условие:
Роутер должен принять бинды для данного url, http метод и действие. Затем, когда приходит запрос со связанным URL-адресом и методом, он должен вернуть результат действия. Пример:
var router = new Router;
router.bind('/hello', 'GET', function(){ return 'hello world'; });
router.runRequest('/hello', 'GET') // returns 'hello world';
Когда запрашивается маршрут, который не существует, маршрутизатор должен вернуть: 'Error 404: Not Found'
В чём соль. Я написал вот такое решение:
const Router = function() {
this.firstArg = "";
this.secondArg = "";
this.funcArg;
this.bind = function(url, method, action) {
this.firstArg = url;
this.secondArg = method;
this.funcArg = action();
};
this.runRequest = function(url, method) {
if (url != this.firstArg && method != this.secondArg) {
return "Error 404: Not Found";
} else {
return this.funcArg;
}
};
};
Но оно не работает. Решил поискать рабочее решение в интернете. Нашел вот это:
class Router {
constructor() {
this.routes = new Map();
}
bind(url, method, action) {
this.routes.set(url + ":" + method, action);
}
runRequest(url, method) {
if (!this.routes.has(url + ":" + method)) {
return "Error 404: Not Found";
}
return this.routes.get(url + ":" + method)();
}
}
Я не понимаю, в чем принципиальное различие между этими решениями? Да, тут класс. Да ,тут как я понял, создался ключ из url и method хранящий action. Но в конце концов оба подхода проводят проверку существует ли введенный запрос и выводит action или 'Error 404: Not Found' в противном случае. Объясните пожалуйста, почему мой подход не работает в таком случае
В вашем варианте заключены несколько важных ошибок 1) Ваша реализация может сделать привязку только к одному адресу.
this.bind = function(url, method, action) {
this.firstArg = url;
this.secondArg = method;
this.funcArg = action();
};
В приведённом приведённом примере из Интернета используется Map что бы задать множество пар (ключ - значение)
2) Вы сразу вызываете обработчик запроса при создании новой связи
this.funcArg = action();
Из этого вытекает следующая ошибка
3) Вы не вызываете обработчик при наступлении события и не возвращаете его результат. В примере из Интернета это строка
return this.routes.get(url + ":" + method)();
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как подсчитать сумму cmon в массивах? Надо получить сумму массива red и black
есть 2 скрипта асинхронных, запускается первый и дальше ничего не происходит, второй не запускается, просто виситВ чем проблема?
Можно ли с помощью JS или же другого языка запустить определенный ярлык с рабочего стола Windows 10?
Перепробовала вообще все, что гугл выдавал - не работает: приведение к числу (parseInt(), Number()) или строке, через setDate()Сталкивались ли вы с таким...