一些理由使用承诺在回调:
- 更加简单序列多个异步操作。
- 构建涉及多个异步操作的条件逻辑非常简单。
- 更简单的做强大的错误处理涉及多个异步操作。
- 构建可重用的异步接口非常简单。
- 与其他异步接口的接口更简单。
- 更加简单应付可能发生的异步代码深例外,否则将导致沉默失败
在你的问题,测序jQuery的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()
单个承诺。
你可以做你的第二个办法:
// callback on success
$.ajax({
url:'/ajax_call_1',
data: { },
success: function(data){
$.get('ajax_call_2');
}
});
由于这仅仅是嵌套回调编码的非承诺的方式。主要缺点是错误的传播和多个操作的排序在不使用承诺时会变得混乱和困难。在这个简单的例子中,尝试从任何一个ajax调用返回调用者的错误。这需要很多额外的代码。我上面的承诺示例将所有错误传回给调用者。
至于你具体的问题:
1)什么是使用一个比另一个好处?
你基本上问为什么使用过的承诺嵌套回调。有数百篇关于使用promise的优点的文章。我会看看我能否找到一两个,但谷歌搜索“为什么承诺与回调”应该让你开始阅读。
What’s so great about JavaScript Promises?
Staying Sane with Asynchronous Programming
Why Am I Switching to Promises
2)在什么情况下是一个优于其他?
我知道没有理由不使用普通的嵌套回调而不愿使用promise。一旦你已经学会了承诺,你几乎总能找到更好的代码方式。我不会用承诺的唯一原因是,如果我试图让代码,这是与没有的承诺,即使是这样,我可能只是包括填充工具,使承诺得到了支持旧的浏览器兼容。
3)难道还有比这2任何其他更好的方法?
是的,看到我的第一个代码示例。
P.S.请注意,我选择只使用.then()
jQuery的承诺,因为这是ES6承诺标准时的jQuery过渡的承诺更加标准兼容的(这是他们正在努力),这将使它在未来更容易。与使用该标准的其他承诺来源接口时,您的代码也会更加一致。
P.P.S.承诺是一次性设备。他们要么解决,要么拒绝一次。如果您试图从某个源获取多个通知,那么承诺不会为此而建立。事件发布者或发布/订阅系统可能更适合这类问题。