JS Curring статическая функция - PullRequest
0 голосов
/ 01 октября 2018

У меня есть фрагмент кода, подобный следующему.

// controller.js
class Controller {
    static easyPost = _post(EasyAuth, EasyValidate, EasyHandle);

    static hardPost = _post(HardAuth, HardValidate, HardHandle);

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

module.exports = Controller;

//controllermapper.js
const Controller = require("./controller");

class ControllerMapper {
    static map(req) {
        switch (req.path) {
            case "/easyPost":
                Controller.easyPost(req);
                break;
            case "/hardPost":
                Controller.hardPost(req);
                break;
        }
    }
}

Задумка заключается в том, что я могу создавать easyPost и hardPost с помощью карри.Потому что их общий поток очень похож.

Тем не менее, когда я пытаюсь передать код в Google Cloud Function.Выдает ошибку вроде

> Detailed stack trace: /user_code/controller.js:6
>     static easyPost = _post(EasyAuth, EasyValidate, EasyHandle);
>                     ^
> 
> SyntaxError: Unexpected token =

Что мне сделать, чтобы решить эту проблему?


РЕДАКТИРОВАТЬ

Я изменил свой код на

// controller.js
class Controller {
    static easyPost(req) {
        Controller._post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        Controller._post(HardAuth, HardValidate, HardHandle)(req);
    }

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

Можно ли это прокомментировать, если это хорошая практика?

1 Ответ

0 голосов
/ 01 октября 2018

Это будет работать в данный момент

class Controller {
    static _post(auth, validate, handle) {
        return req => {
            if (auth(req) && validate(req)) handle(req);
        };
    }
}
Controller.easyPost = _post(EasyAuth, EasyValidate, EasyHandle);
Controller.hardPost = _post(HardAuth, HardValidate, HardHandle);

Есть предложение этапа 3, в котором ваш код, как написано, будет работать - https://github.com/tc39/proposal-static-class-features/

ну не совсем так, как написано -вам нужно указать Controller._post следующим образом

class Controller {
    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
    static easyPost = Controller._post(EasyAuth, EasyValidate, EasyHandle);
    static hardPost = Controller._post(HardAuth, HardValidate, HardHandle);
}

Примечание: вы можете включить это в babeljs, но это на втором этапе в babel

Что касается вашего обновленного кода - вы по-прежнемунужно вызвать Controller._post, а не просто _post

class Controller {
    static easyPost(req) {
        return Controller._post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        return Controller._post(HardAuth, HardValidate, HardHandle)(req);
    }

    static _post(auth, validate, handle) {
        return (req) => {
            if (auth(req) && validate(req))
                handle(req);
        }
    }
}

Чтобы продемонстрировать, что вы ДОЛЖНЫ использовать Controller._post, вот сокращенная версия вашего кода

class Controller {
    static succeeds(req) {
        return Controller._post()(req);
    }

    static fails(req) {
        return _post()(req);
    }

    static _post() {
        return (req) => {
          	return `got ${req}`;
        }
    }
}
console.log(Controller.succeeds('ok'))
console.log(Controller.fails('ok'))

и, наконец, версия кода, в которой вам не нужно использовать Controller._post

const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
class Controller {
    static easyPost(req) {
        return post(EasyAuth, EasyValidate, EasyHandle)(req);
    }

    static hardPost(req) {
        return post(HardAuth, HardValidate, HardHandle)(req);
    }

}
module.exports = Controller;

сейчас postтоже приватный

Хотя, если бы я писал это, я просто сделал бы

const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
class Controller {
}
Controller.easyPost = post(EasyAuth, EasyValidate, EasyHandle);
Controller.hardPost = post(HardAuth, HardValidate, HardHandle);
module.exports = Controller;

или, если это действительно все, что есть в Controller

const post = (auth, validate, handle) => (req) => {
    if (auth(req) && validate(req)) {
        handle(req);
    }
};
module.exports = {
    easyPost: post(EasyAuth, EasyValidate, EasyHandle),
    hardPost: post(HardAuth, HardValidate, HardHandle)
};
...