我需要为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);
}
希望有人有个主意!
答案 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.
答案 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'
});
答案 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]