使用 bind 指定传递的回调函数参数的顺序
Specify the order of passed callback functions parameters using bind
我想在某些情况下将参数传递给回调函数。例如,我有两条路线要指向相同的功能。对于指定复数的路由我想允许删除多个东西。
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku);
deleteSku(req, res, allowMultiple = false) {
//... delete code here ...
}
我知道这可以用下划线和 lodash 来完成
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', _.bind(this.deleteSku, _, _, true));
但这对我来说很难看,而且我认为它会影响代码的可读性,尤其是当人们不熟悉下划线时。
我也知道您可以通过本机绑定指定参数,但这会将参数放在函数的前面。
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku.bind(null, true));
deleteSku (allowMultiple = false, req, res) { }
现在重写 deleteSku
以首先处理 allowMultiple
感觉很奇怪,如果我不对单一路由案例进行绑定,它就会中断。
另一种选择是让 deleteSku
和 deleteSkus
方法本质上做同样的事情,但映射到不同的路由。我希望有更好的解决方案可以减少代码。
.bind()
只在开头绑定额外的参数。我同意你的看法,即开头不是你想要 allowMultiple
论点的地方。所以,.bind()
真的不会在那里为你做正确的事。 Javascript 中没有内置选项来后置参数而不是像 .bind()
那样前置。
因为我不完全确定 Express 何时将第三个参数传递给您的回调 (req, res, next)
,我会非常非常小心地使用默认参数,就像您对路由处理程序所做的那样。 Express 似乎很可能会传递第三个参数,而您的路由处理程序 this.deleteSku
会意外地将其解释为传递的 allowMultiple
参数。因此,我建议您这样做:
server.app.delete('/api/delete/sku', (req, res) => this.deleteSku(req, res, false));
server.app.delete('/api/delete/skus', (req, res) => this.deleteSku(req, res, true));
然后,勾选所有方框:
- 还是一行代码
- 它在做什么完全明确且可读
- 不依赖任何第三方库
- Express 将
next
参数传递给您的处理程序并造成混淆是完全安全的。
我想在某些情况下将参数传递给回调函数。例如,我有两条路线要指向相同的功能。对于指定复数的路由我想允许删除多个东西。
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku);
deleteSku(req, res, allowMultiple = false) {
//... delete code here ...
}
我知道这可以用下划线和 lodash 来完成
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', _.bind(this.deleteSku, _, _, true));
但这对我来说很难看,而且我认为它会影响代码的可读性,尤其是当人们不熟悉下划线时。
我也知道您可以通过本机绑定指定参数,但这会将参数放在函数的前面。
server.app.delete('/api/delete/sku', this.deleteSku);
server.app.delete('/api/delete/skus', this.deleteSku.bind(null, true));
deleteSku (allowMultiple = false, req, res) { }
现在重写 deleteSku
以首先处理 allowMultiple
感觉很奇怪,如果我不对单一路由案例进行绑定,它就会中断。
另一种选择是让 deleteSku
和 deleteSkus
方法本质上做同样的事情,但映射到不同的路由。我希望有更好的解决方案可以减少代码。
.bind()
只在开头绑定额外的参数。我同意你的看法,即开头不是你想要 allowMultiple
论点的地方。所以,.bind()
真的不会在那里为你做正确的事。 Javascript 中没有内置选项来后置参数而不是像 .bind()
那样前置。
因为我不完全确定 Express 何时将第三个参数传递给您的回调 (req, res, next)
,我会非常非常小心地使用默认参数,就像您对路由处理程序所做的那样。 Express 似乎很可能会传递第三个参数,而您的路由处理程序 this.deleteSku
会意外地将其解释为传递的 allowMultiple
参数。因此,我建议您这样做:
server.app.delete('/api/delete/sku', (req, res) => this.deleteSku(req, res, false));
server.app.delete('/api/delete/skus', (req, res) => this.deleteSku(req, res, true));
然后,勾选所有方框:
- 还是一行代码
- 它在做什么完全明确且可读
- 不依赖任何第三方库
- Express 将
next
参数传递给您的处理程序并造成混淆是完全安全的。