JS Currying 一个静态函数
JS Currying a static function
我有一段代码如下。
// 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;
}
}
}
背后的想法是我可以通过currying创建easyPost
和hardPost
。因为他们的总体流程非常相似。
但是,当我尝试将代码推送到 Google 云函数时。它会抛出类似
的错误
> 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);
}
}
}
如果这是一个好的做法,可以对此发表评论吗?
目前可以使用
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 中处于第 2 阶段
关于您更新的代码 - 您仍然需要调用 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)
};
我有一段代码如下。
// 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;
}
}
}
背后的想法是我可以通过currying创建easyPost
和hardPost
。因为他们的总体流程非常相似。
但是,当我尝试将代码推送到 Google 云函数时。它会抛出类似
的错误> 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);
}
}
}
如果这是一个好的做法,可以对此发表评论吗?
目前可以使用
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 中处于第 2 阶段
关于您更新的代码 - 您仍然需要调用 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)
};