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

Javascript 如何使用done()或next()将参数传递给下游函数,javascript,jquery,Javascript,Jquery,我不熟悉next()、done()等,并且正在努力在串行执行之间传播参数/链接可能是异步函数 我想强制串行执行2个函数,这样就可以用如下方法调用它们: f1('#{arg1a}', '#{arg1b}').done( f2('#{arg2a}', '#{arg2b}') ); 或者类似于: f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2); function f1(arg1a, arg1b) { //do so

我不熟悉next()、done()等,并且正在努力在串行执行之间传播参数/链接可能是异步函数

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

f1('#{arg1a}', '#{arg1b}').done(
  f2('#{arg2a}', '#{arg2b}')
);
或者类似于:

f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2);
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.
}
其中传入的arg值是使用JSF从查询参数中收集的

请注意:


  • 就我而言,
    arg2a
    arg2b
    arg1a
    arg1b
    完全无关,
    f2
    的调用在任何方面都不依赖于
    f1
    中发生的事情,除非它必须在之后严格执行,即使
    f1
    通常是异步的

  • 我不是在这里定义即时匿名函数或类似的inside done(),我希望能够使用一些已知的参数调用库定义的函数

在本例中,函数类似于:

f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2);
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.
}
或者类似于:

f1('#{arg1a}', '#{arg1b}', '#{arg2a}', '#{arg2b}').done(f2);
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.
}
仅使用回调链接对我正在处理的情况不起作用。另见:


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

您需要将参数传递到
.resolve()
,然后使用
.then()


jsFIDLE

除了忘记将将来要执行的代码(当最终调用
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()

中访问。我看不出您是如何将arg2a和arg2b的实值(最终由
f2
处理)传递到
f1(arg1,arg2)中的。然后(f2).
“我不知道您是如何传递arg2a和arg2b的实值”您的意思是什么?您可以将需要传递的任何值传递给
。resolve()
arg2a
arg2b
在我的情况下与
arg1a
arg1b
完全无关。当您调用
f1(arg1a、arg1b)时,然后调用(f2)没有注入从arg2a、arg2b的JSF参数中收集的值的时刻。它们甚至不会出现在调用代码中。“在我的例子中,arg2a和arg2b与arg1a和arg1b完全无关”同样,您可以将需要传递的任何值传递给
.resolve()
;当调用
.resolve()
时,将使用
f2
作为参数调用()
。您在
f2
中包含了参数,尽管它们不必是从
f2
返回的值,但值不必是
arg1a
arg1b
。JSFIDLE将演示模式,以满足原始问题“f2的调用在任何方面都不依赖于f1中发生的事情,除非它必须在之后严格执行”中所述的要求。谢谢,现在您已经编辑了该模式,以正确处理并演示调用附加参数以馈送到
f2
(这对其他读者来说是有意义的)。我点击了这个
。然后(…)。catch在我的系统中不是一个函数,所以我使用了
fail()
,然后它就运行了。
then()
策略无法解决问题,但您的解决方案至少让我能够测试策略(并了解更多关于then()和承诺的信息)。
return$.Deferred().resolve()
毫无意义,因为您正在同步调用resolve,在这种情况下,您甚至不需要处理此异步。您是否在
f1
中使用异步函数?另外,您能否给出一个同步示例,说明您正在尝试执行的操作。类似于“如果这是同步的,我希望执行此操作…”感谢您的备选答案,这无疑(如@guest271314的修正后的alread接受答案)使
f2
的值对其可用。但是,与
next(
callback
方法一样,在我的中,
完成(
after
f2
f1
完成之前运行,因此某些选择器出现故障(因为它们尚未可供选择)。但这超出了这个问题的范围。@WebElitaria upvoter:这个问题的问题是,你在等待任何事情完成之前调用了
回调
。因此它不起作用。回调的目的是让你可以将它传递给你正在等待的东西。如果这个东西不能提供给你通过回调或承诺,您必须使用
setTimeout
轮询DOM,并等待等待的东西存在。