javascript - 在不使用 javascript 中的闭包的情况下传递给函数之前转换参数

标签 javascript node.js underscore.js

有时我发现自己在 Node 中有以下模式。

var foobar = function(x, y) {
  foo(x, bar(y));
};

您可以想象,您可能会将此模式视为一个匿名闭包,它在对结果执行转换 bar 后调用回调函数 foo

... , function(err, result) {
    callback(err, transform(result));
} ...

我的问题;有没有办法以优雅的方式简化这种模式?理想情况下,它不需要新的实用函数(如下所示)即可工作,而是利用下划线(或类似的)。


尝试的解决方案

foobar 的组合很接近(这让我想到下划线的 _.compose 的变体),但是转换后的value 只是传递给 foo 的参数之一。

我的不雅解决方案需要一个新的效用函数(并且可能不适用于非原始参数)是:

function partialCompose(func, transform, position) {
    var args = Array.prototype.slice.call(arguments, 3);
    args[position] = transform(args[position]);
    return func.apply(this, args);
}

//usage
var foobar = partialCompose.bind(this, foo, bar, 1)

我个人认为这在清晰度方面比原始模式差。任何人都可以对此进行改进吗?感觉应该比较简单,我漏掉了一些明显的东西。

最佳答案

我最近找到了图书馆Ramda :

A practical functional library for Javascript programmers.

我的早期印象似乎是它试图扩展和改进 underscore 和 lodash 等库,同时更严格地坚持纯函数式风格。方便的是,Ramda 包含 useWith,它解决了我原来问题的通用版本。它被描述为:

Accepts a function fn and any number of transformer functions and returns a new function. When the new function is invoked, it calls the function fn with parameters consisting of the result of calling each supplied handler on successive arguments to the new function.

换句话说,我原来的 foobar 模式变成了:

//transform the 1st passed argument with R.identity()
//and the 2nd with bar(), pass the results to foo

var foobar = R.useWith(foo, R.identity, bar);

我仍然不知道可以使用下划线或 lodash 开箱即用的方法,这意味着至少现在,Ramda 值得进一步研究。

关于javascript - 在不使用 javascript 中的闭包的情况下传递给函数之前转换参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28348867/

相关文章:

javascript - 根据 javascript 中的条件合并两个嵌套的 JSON 对象

c# - ServiceStack 社交 Bootstrap API 示例 - 登录

javascript - Materializecss 开关元素改变事件

node.js - "clean"在Sails.js 中使用不同ORM(例如node-orm2)的方法?

javascript - 如何从指令设置输入类型文本的值,该指令从数组中获取随机值

node.js - 一旦我关闭终端或我的 ssh session ,我就无法让我的服务器继续运行

mysql - 用其他对象的相应名称替换对象 ID

Javascript下划线数组到对象

javascript - React 路由器 - 从外部组件导航时页面不会改变

javascript - 如何使用 jQuery 将类添加到属于现有 <li> 标记的 span 元素