我是next(), done()等的新手,并且正在努力在串行执行/可能其他异步函数的链接之间传播参数。
我想强制两个函数串行执行,这样它们就可以用以下方式调用:
f1('#{arg1a}', '#{arg1b}').done(
f2('#{arg2a}', '#{arg2b}')
);
或者:
f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2);
其中传入的参数值是使用JSF从查询参数中收集的。
注意:
arg2a
和arg2b
在我的情况下完全与arg1a
和arg1b
无关,f2
的调用不依赖于f1
中发生的任何方式,除了它必须严格执行之后,即使f1
通常是异步的。我没有定义动态匿名函数或这样的内部done()在这里(尚未),我希望能够调用一个库定义的函数与一些已知的参数。
在这个例子中,函数类似于:
function f1(arg1a, arg1b) {
//do something with arg1a, arg1b
return $.Deferred().resolve();
}
function f2(arg2a, arg2b) {
// Do something with arg2a and arg2b AFTER f1 has fully run.
}
或者:
function f1(arg1a, arg1b, arg2a, arg2b) {
//do something with arg1a, arg1b
// Somehow ensure f1 is finished then execute f2(arg2a, arg2b)
}
function f2(arg2a, arg2b) {
// Do something with arg2a and arg2b AFTER f1 has fully run.
}
只是使用回调链不工作的情况下,我正在处理。参见:如何在p:tabview中的p:tab中的p:accordionPanel中链接和目标/打开p:tab
一个可接受的答案必须允许我有一个预定义的函数f2与预定义的参数
您需要将参数传递给.resolve()
,然后使用.then()
function f1(arg1a, arg1b) {
return $.Deferred(function(dfd) {
//do something with arg1a, arg1b
// you can alternatively call `.resolve()` without passing parameters
// when you are finished doing something with `arg1a`, `arg1b`,
// which should call chained `.then()` where `f2` is called
dfd.resolve(arg1a, arg1b)
}).promise();
}
function f2(arg2a, arg2b) {
// Do something with arg2a and arg2b AFTER f1 has fully run.
}
f1(arg1, arg2)
.then(function() {
// call `f2` here
f2('#{arg2a}', '#{arg2b}');
})
// handle errors
.catch(function(err) { // alternatively use `.fail()`
console.log(err)
});
jsfiddle https://jsfiddle.net/wuy8pj8d/
除了忘记将将来要执行的代码(当done
最终被调用时)包装在函数内之外,您几乎已经正确了:
f1('#{arg1a}', '#{arg1b}').done(function(){
f2('#{arg2a}', '#{arg2b}')
});
这也适用于常规回调。例如,假设您已经定义了f1
来接受回调而不是承诺,那么您将这样做:
f1('#{arg1a}', '#{arg1b}',function(){
f2('#{arg2a}', '#{arg2b}')
});
这里没什么特别的。没有单独的语法来强制回调接受自定义参数,只需将其包装在另一个函数中。
由于闭包,这也适用于变量:
var a='#{arg1a}', b='#{arg1b}';
var c='#{arg2a}', d='#{arg2b}';
f1(a,b).done(function(){
f2(c,d)
});
变量c
和d
可以在done()
中访问。