Javascript 如何使用done()或next()将参数传递给下游函数
我不熟悉next()、done()等,并且正在努力在串行执行之间传播参数/链接可能是异步函数 我想强制串行执行2个函数,这样就可以用如下方法调用它们: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
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
方法一样,在我的中,完成(
afterf2
在f1
完成之前运行,因此某些选择器出现故障(因为它们尚未可供选择)。但这超出了这个问题的范围。@WebElitaria upvoter:这个问题的问题是,你在等待任何事情完成之前调用了回调
。因此它不起作用。回调的目的是让你可以将它传递给你正在等待的东西。如果这个东西不能提供给你通过回调或承诺,您必须使用setTimeout
轮询DOM,并等待等待的东西存在。