我已经看到了执行多个相关的ajax同步调用的不同方法。广泛采用的两个方法是jquery defer方法和成功回调。
我的问题是: 1)相比使用另一种优势是什么? 2)在什么情况下一个人比另一个人更受青睐? 3)除了这2之外,还有其他更好的方法吗?
// jquery defer method var defer = $.when( $.get('ajax_call_1'); ); defer.done(function () { $.get('ajax_call_2'); }); // callback on success $(function(){ $.ajax({ url:'/ajax_call_1', data: { }, success: function(data){ $.get('ajax_call_2'); } }); } });
使用基于回调的承诺的一些原因:
在您的问题中,对jQuery Ajax调用进行排序并捕获所有可能的错误的最简单方法是使用从其返回的自然诺言$.ajax()并将它们链接起来:
$.ajax()
$.get('ajax_call_1').then(function(value) { return $.get('ajax_call_2'); }).then(function(result) { // success with both here }, function(err) { // error with one of them here });
或者,没有像您的示例那样的错误处理:
$.get('ajax_call_1').then(function(value) { $.get('ajax_call_2'); })
这里没有理由使用此构造:
// jquery defer method var defer = $.when( $.get('ajax_call_1'); );
因为$.get()已经返回了一个承诺,所以无需使用它$.when()来创建另一个承诺。 $.when()当您有多个承诺并且想知道所有承诺何时完成时,此功能非常有用。对于一个承诺,您可以直接使用它- 没有理由$.when()与单个承诺一起使用。
$.get()
$.when()
您可以使用第二种方法:
// callback on success $.ajax({ url:'/ajax_call_1', data: { }, success: function(data){ $.get('ajax_call_2'); } });
因为这只是使用嵌套回调进行编码的非承诺方式。主要的缺点是错误传播和对多个操作进行排序会在不使用诺言的情况下变得混乱和困难。仅在此简单示例中,尝试从任一ajax调用中获取错误并返回给调用者。为此,需要大量额外的代码。上面的我的promise示例将所有错误传播回给您的调用者。
至于您的具体问题:
1)相较之下,使用一个有什么优势?
您基本上是在问为什么对嵌套的回调使用promise。关于使用诺言的好处的文章有数百篇。我将看看是否可以找到一两个,但是Google搜索“为什么要对接回调”应该使您开始阅读。
JavaScript Promises有何优点?
异步编程保持精明
为什么我要转为承诺
2)在什么情况下一个人比另一个人更受青睐?
我不知道为什么使用普通嵌套回调比使用Promise更好。一旦学习了承诺,您几乎总会发现它们是更好的编码方式。我不使用Promise的唯一原因是,如果我试图使代码与没有Promise的旧浏览器兼容,即使那样,我可能仍会添加一个polyfill来支持Promise。
3)除了这2之外,还有其他更好的方法吗?
是的,请参阅我的第一个代码示例。
PS注意,我选择只.then()与jQuery Promise一起使用,因为这是ES6 Promise标准,并且当jQuery将其Promise转换为与标准更加兼容时,它将使将来变得更容易(它们正在努力)。与确实使用该标准的其他Promise源进行交互时,您的代码也将更加一致。
.then()
PPS承诺是一次性的设备。他们要么解决,要么拒绝一次。如果您试图从某个来源获取多个通知,则不会为此建立承诺。对于这种类型的问题,事件发射器或发布/订阅系统可能更合适。