【问题标题】:Ordering the function calls排序函数调用
【发布时间】:2017-04-16 07:37:56
【问题描述】:

我必须按顺序调用函数,但不知何故它们独立工作。

以下是函数:

function a(){
  Ajax_Call_1();
}

function b(){
  Ajax_Call_2();
}

function c(){
  Ajax_Call_3();
}

$.when( a() ).then( $.when( b() ).then( c() ) );

当我运行它时,它看起来像:

一个作品

C 作品

B 作品

但有时:

C 作品

一个作品

B 作品

我如何订购它们?

【问题讨论】:

  • then 应该采用一个函数,以便在异步操作完成时执行它。按照您的编写方式,您只是在尽可能快地执行所有 3 个函数。
  • 人们仍然更喜欢 jquery 而不是 promises?很奇怪。
  • a().then(b).then(c) ?这三个人都必须返回$.ajax 或其他任何东西。
  • @GottZ jQuery 使用 Promises (jQuery.Deferred 基于 CommonJS Promises/A...
  • @MikeC 我猜......我通常使用我当时正在使用的库/框架中内置的功能(以保持代码更加一致),但这就是我。

标签: javascript jquery .when


【解决方案1】:

您可以使用then 方法链接类似promise 的对象。注意thendone/fail 之间的区别,传递给thendone 回调可以为控制流的其余部分返回一个新的类似promise 的对象。这就是您可以进行链接的原因。见the documentation

a().then(b).then(c).done(function() { // the last promise has been resolved });

您的所有函数都应该return 承诺对象才能使其工作。所以你的b 应该是这样的。

function b(){
  return Ajax_Call_2();
}

Ajax_Call 本身应该返回 ajax 调用的位置,例如 return $.ajax(...)

请注意,bc 都返回了 Promise,您可以将它们直接传递给 then

【讨论】:

  • 谢谢。添加“return”后问题已解决
【解决方案2】:

您可以通过返回它们来按顺序链接它们:

$.when(a()).then(function() {
    return b();
}).then(function() {
    return c();
}).then(function() {
    console.log("Done!");
});

【讨论】:

  • 您可以直接传递这些函数,而无需将它们包装到匿名函数中。
  • 但 a,b 或 c 也不返回承诺
  • @A.Wolff 好点,我不够小心。但显然他们应该兑现承诺。
  • @NewPHPer - 您还需要在 a、b、c 函数中返回 ajax 调用,否则它将尝试使用 undefined
  • @MitchelldeRijcke 是的,你是对的。问题已解决。谢谢你的帮助:)
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多