如何使用done()或next()

时间:2016-09-27 06:25:34

标签: javascript jquery

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

我想强制执行2个函数的串行执行,因此可以使用以下任一方法调用它们:

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

或类似的东西:

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

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

请注意:

  • arg2aarg2b在我的案例中完全与arg1aarg1b无关,而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

2 个答案:

答案 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)
});

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