我想在某些情况下将参数传递给回调函数。例如,我有两条路线,我想指向相同的功能。对于指定复数的路径,我希望允许删除多个内容。
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));
但这对我来说很难看,我认为这会影响代码的可读性,特别是如果人们不熟悉下划线。
我也知道你可以通过native bind指定参数,但是将参数放在函数的前面。
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
方法基本上做同样的事情,但映射到不同的路线。我希望有一个更好的解决方案可以减少代码。
答案 0 :(得分:0)
.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));
然后,勾选所有方框:
next
参数传递给您的处理程序并让人感到困惑,这是完全安全的。