你能不在不调用参数的情况下将参数传递给函数吗?

时间:2014-02-04 10:56:50

标签: javascript jquery promise

我需要为pipe()处理函数提供一堆函数名,以便它可以按顺序执行它们,等待每个函数的完成。当这些函数不需要参数传递时,这很好,但是当参数 需要时,我无法弄清楚如何在没有函数继续并调用自身的情况下传递它们(由括号引起)。

例如,这就是我通常传递的内容:

pipeHandler([function1, function2]);

然后,在承诺完成之前,它会调用function1()function2()

当我想要做这样的事情时,困难之处在于:

pipeHandler([function1('value'), function2]);

这会导致function1()立即调用,完全绕过promise机制。

如果有帮助,这就是处理函数:

function pipeHandler(requiredFunctions) {
    //Execute first required function
    var executeFunctions = requiredFunctions[0]();

    //Execute each subsequent required function using pipe()
    for ( var index = 1; index < requiredFunctions.length; index++ ) {
        executeFunctions = executeFunctions.pipe(requiredFunctions[index]);
    }

    //Execute allDone() using pipe()
    executeFunctions = executeFunctions.pipe(allDone);
}

希望有人有个主意!

8 个答案:

答案 0 :(得分:4)

为什么不

pipeHandler([function() { function1('value'); }, function2]);

这是匿名功能闪耀的地方。如果您花一些时间在Javascript中工作,那么在某些时候使用setTimeOut时可能会遇到同样的问题。

答案 1 :(得分:3)

这可以使用bind简洁地完成。语法:

pipeHandler([function1.bind(scope, 'value')];

Bind返回部分函数应用程序,它是范围scope中的新函数,具有固定的第一个参数'value'。它可以使用任意数量的参数。

答案 2 :(得分:1)

您可以使用匿名函数,该函数可以调用function1

pipeHandler([function () {;
    function1('value')
}, function2]);

答案 3 :(得分:0)

您可能正在寻找的内容称为“部分申请”。

根据您需要支持的浏览器,您可以使用bind.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Partial_Functions

答案 4 :(得分:0)

据我所知,通过阅读这个问题,没有异步性,只是一个常规的单线程函数调用序列,可以在每次调用时传递参数。

如果是,那么您想使用jQuery.Callbacks。您的场景正是jQuery.Callbacks的用途。文档说:

  

1.7版中引入的jQuery.Callbacks()函数返回一个   多用途对象,提供管理回调的强大方法   名单。它支持添加,删除,触发和禁用回调。

阅读了jQuery.Callbacks的文档后,如何将参数传递给列表中的函数可能仍然不明显。

最简单的选择是使用可供列表中的函数使用的对象来激活列表:

function myFunction1(obj) {
    console.log(obj.myProperty1);
}

function myFunction2(obj) {
    console.log([obj.myProperty1, obj.myProperty2].join());
}
var callbacks = $.Callbacks();
callbacks.add(myFunction1);
callbacks.add(myFunction2);
callbacks.fire({
    myProperty1: 'X',
    myProperty2: 'Y'
});

更加苛刻的方法可以让您:

  • 指定添加到列表中的每个函数的参数,
  • 为列表中的所有功能指定上下文

因此为您提供了两种机制,用于将数据传递给函数,以及在.add()语句或.fire()语句中指定数据的自由度,或者两者兼而有之。 / p>

为此,您需要以下实用程序功能:

function makeClosure(fn) {
    var args = Array.prototype.slice.call(arguments, 1);//seriously clever line - thank you John Resig
    return function (context) {
        fn.apply(context, args);
    }
}

可以按如下方式使用:

function f1() {
    console.log(this.myProperty));
}

function f2(value1, value2) {
    console.log(value1 + ', ' + value2);
}

function f3(value1, value2) {
    //note the use of `this` as a reference to the context.
    console.log(value1 + ', ' + value2 + ', ' + this.myProperty);
}

var callbacks = $.Callbacks();
callbacks.add(makeClosure(f1, 'A1'));
callbacks.add(makeClosure(f2, 'B1', 'B2'));
callbacks.add(makeClosure(f3, 'C1', 'C2'));
callbacks.fire({
    myProperty: 'Z'
});

DEMO

答案 5 :(得分:0)

如果您想在不调用函数的情况下传递参数,可以这样做:

function add (a, b) {
    return a + b;
}

// Outputs: 3
console.log(add(1, 2));

// Outputs: function
console.log(add.bind(this, 1, 2));

这将返回一个函数

function () { [native code] }

如果您想调用它

// this will return 3
console.log(add.bind(this, 1, 2)());

答案 6 :(得分:0)

jQuery的$.proxy(function, context, value)在这种情况下特别有用,因为它:

  

接受一个函数并返回一个始终具有特定上下文的新函数。

因此,不仅可以更改正在调用的函数的上下文(可以提供对象而不是this),而且还可以传递与函数接收的一样多的参数/参数值无需直接调用

function fun_w_param(v) {console.info("I'm #1, here's my value: " + v)}
function fun_no_param() {console.info("I'm #2")}
function pipeHandler(f1, f2) {
  f2();
  console.warn("Handling function1 with a second delay");
  setTimeout(function(){f1()}, 1000);
}
// add your value below as a proxy's argument
pipeHandler(
  $.proxy(fun_w_param, this, '!!!PROXY!!!'),
  fun_no_param
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

运行上述命令会延迟“ function1”的执行,并将显示您在代理参数中提供的值。

答案 7 :(得分:0)

使用arrow方法,您可以简单地做到这一点

pipeHandler([() => function1('value'), function2]