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



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

我想强制两个函数串行执行,这样它们就可以用以下方式调用:

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

或者:

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

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

注意:

  • arg2aarg2b在我的情况下完全与arg1aarg1b无关,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)
});

变量cd可以在done()中访问。

最新更新