如何使用done()或next()将参数传递给下游函数

我是next(),done()等的新手,并且正在努力在串行执行之间传播参数/链接可能的异步函数。

我想强制执行2个函数的串行执行,这样就可以调用它们:

f1('#{arg1a}', '#{arg1b}').done( f2('#{arg2a}', '#{arg2b}') ); 

或类似的东西:

 f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2); 

传入的arg值是使用JSF从查询参数中收集的。

注意:

  • 在我的情况下, arg1aarg1barg1aarg1b完全无关,并且f2的调用并不以任何方式依赖于f1发生的事情,除非它必须严格执行,即使f1通常是异步的。

  • 我没有定义动态匿名函数或者在这里(还)这样的内部完成(),我希望能够使用一些已知的参数来调用库定义的函数。

在此示例中,函数将类似于:

 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. } 

仅使用回调链接对我正在处理的情况不起作用。 另请参阅: ap:tabview中ap:tab中p:accordionPanel内的链接和目标/打开ap:tab的链接方式

一个可接受的答案必须允许我有一个带有预定义参数的预定义函数f2

你需要将参数传递给.resolve() ,然后使用.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) }); 

变量cd将在done()可访问。