添加新的第一个参数,然后应用原始参数

时间:2016-01-27 20:03:57

标签: javascript node.js

我使用map来映射一组函数,如:

function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
            fn(consumer, arguments);
        }
    });

    async.waterfall(fns, cb);

}

所以你可以看到,我想添加“consumer”作为每个函数fn的第一个参数,但我不相信我的语法是正确的。

也许这更好:

function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
            fn.apply(null,[consumer, arguments]);
        }
    });

    async.waterfall(fns, cb);

}

我怀疑其中任何一个是正确的

2 个答案:

答案 0 :(得分:1)

好问题!你几乎就在那里,只需要将类似数组的arguments转换为数组并将其与consumer

连接起来
function runWaterfall(consumer, fns, cb) {

    fns = fns.map(function (fn) {
        return function () {
           var args = Array.prototype.slice.call(arguments, 0);           
           fn.apply(null, [consumer].concat(args));
        }
    });

    async.waterfall(fns, cb);

}

答案 1 :(得分:1)

您不仅可以使用Function.prototype.bind设置this上下文,还可以提供参数。您与apply关系密切,但它会立即调用该函数,而bind将返回一个预填充参数的函数:

fns = fns.map(function (fn) {
    return fn.bind( null, consumer )
});

https://jsfiddle.net/qmuv8com/