我是next(),done()等的新手,并且正在努力在串行执行/链接可能的异步函数之间传播参数。
我想强制执行2个函数的串行执行,因此可以使用以下任一方法调用它们:
f1('#{arg1a}', '#{arg1b}').done(
f2('#{arg2a}', '#{arg2b}')
);
或类似的东西:
f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2);
传入的arg值是使用JSF从查询参数中收集的。
请注意:
arg2a
和arg2b
在我的案例中完全与arg1a
和arg1b
无关,而f2
的调用并不依赖于任何关于f1
中发生的事情的方式,除了必须严格执行之外,即使f1
通常是异步的。
我没有在这里定义动态匿名函数或者里面的done()(还),我希望能够用一些已知的参数来调用库定义的函数。
< / LI>在这个例子中,函数类似于:
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.
}
仅使用回调链接对我正在处理的情况不起作用。另见:How link to and target/open a p:tab within an p:accordionPanel within a p:tab within a p:tabview
一个可接受的答案必须允许我有一个带有预定义参数的预定义函数f2
答案 0 :(得分:1)
您需要将参数传递给.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/
答案 1 :(得分:1)
除了你忘记在将来要包装你想要执行的代码(最终调用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()
内访问。