我正在阅读jquery中的Deferred方法。我知道它是如何工作的,但不知道何时使用它。就像简单的ajax函数一样,我可以使用.success方法进行回调
function customAjax() {
$.ajax({
type: 'GET',
url: 'abc/blala'
}).success(function () {
//callback
})
}
但我看到一些地方就像下面给出的例子一样。所以我不确定何时使用延期。
function customAjax() {
var deferred = jQuery.Deferred();
$.ajax({
type: 'GET',
url: 'abc/blala'
}).success(function (reponse) {
deferred.resolve(response);
});
return deferred.promise
}
答案 0 :(得分:1)
延迟对象是用于获取异步操作结果的东西,以便您可以在应用程序的同步流中使用它,如果这有意义的话。任何异步获得的结果都不能立即返回;相反,它们将来某个时候可用。延迟对象允许您在可用时访问这些结果。
答案 1 :(得分:1)
承诺开发的一般趋势是不再使用Deferred对象或Deferred构造函数。事实上,承诺的ES6标准甚至不支持这样的事情,因为它根本不需要。总是有一种替代方法来编写不创建Deferred对象的东西。
在您使用customAjax方法的特定情况下,根本不需要它。相反,你可以这样做:
function customAjax() {
return $.ajax({
type: 'GET',
url: 'abc/blala'
}).then(function (result) {
// process the result in any way here
return processed result here
});
}
customAjax().then(function(value) {
// do something with value here
});
因此,在您的情况下,您无需创建自己的承诺。你可以使用$.ajax()
已经返回的承诺,然后链接到它并返回它。
注意:我还将您的代码更改为使用.then()
,因为这是"标准"做事的方式,已经得到了jQuery的支持。 jQuery正在转向jQuery 3.x中更加标准兼容的promise实现,所以现在开始编码是明智的。
如果您确实需要在jQuery 1.x或2.x中创建自己的承诺,并希望尽可能与ES6标准兼容,同时仍然使用jQuery支持的东西,您可以执行以下操作:
function delay(t) {
return jQuery.Deferred(function(def) {
setTimeout(function() {
def.resolve();
}, t)
}).promise();
}
出于参考目的,ES6标准语法如下所示:
function delay(t) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, t)
});
}
至于什么时候使用$.ajax()
,生活有点令人困惑。 $.ajax()
支持数十种不同的方式,可以在完成或出现错误时收到通知。有直接回调作为参数传递。有.success()
(现已弃用)。那里的.done()
是承诺的,但非标准的。那里的.then()
几乎是标准的。
在我看来,使用one and only方法并使该方法成为.then()
的标准承诺机制有很大的优势。这样就可以让您拥有使用promise进行异步操作的所有其他优点,包括:
$.when()
或Promise.all()
等内容协调多个异步操作的能力。