使用bind

时间:2017-01-28 00:16:47

标签: javascript express underscore.js bind lodash

我想在某些情况下将参数传递给回调函数。例如,我有两条路线,我想指向相同的功能。对于指定复数的路径,我希望允许删除多个内容。

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感觉很奇怪,如果我不对单一路线案件进行约束,它会中断。

另一种选择是让deleteSkudeleteSkus方法基本上做同样的事情,但映射到不同的路线。我希望有一个更好的解决方案可以减少代码。

1 个答案:

答案 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));

然后,勾选所有方框:

  1. 它仍然是一行代码。
  2. 它完全明确且可读,正在做什么
  3. 它不依赖于任何第三方库
  4. Express将next参数传递给您的处理程序并让人感到困惑,这是完全安全的。