Задача codeWars. Различия решений задачи JavaScript

200
20 января 2022, 03:50

Возникла проблема в решении задачи из 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' в противном случае. Объясните пожалуйста, почему мой подход не работает в таком случае

Answer 1

В вашем варианте заключены несколько важных ошибок 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)();
READ ALSO
Как подсчитать сумму в массиве?

Как подсчитать сумму в массиве?

Как подсчитать сумму cmon в массивах? Надо получить сумму массива red и black

211
Пауза между скриптами

Пауза между скриптами

есть 2 скрипта асинхронных, запускается первый и дальше ничего не происходит, второй не запускается, просто виситВ чем проблема?

175
Запуск игры с рабочего стола JS

Запуск игры с рабочего стола JS

Можно ли с помощью JS или же другого языка запустить определенный ярлык с рабочего стола Windows 10?

75
new Date() возвращает NaN в Safari

new Date() возвращает NaN в Safari

Перепробовала вообще все, что гугл выдавал - не работает: приведение к числу (parseInt(), Number()) или строке, через setDate()Сталкивались ли вы с таким...

76