jquery 延迟的用例
Use case of jquery Deferred
我在 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
}
延迟对象是您用来获取异步操作结果的对象,以便您可以在应用程序的同步流中使用它(如果有意义的话)。任何异步获得的结果都不会立即返回;相反,它们在将来的某个时候可用。延迟对象允许您在这些结果可用时访问它们。
promise 开发的总趋势是不再使用 Deferred 对象或 Deferred 构造函数。事实上,ES6 的 promises 标准甚至不支持这样的事情,因为根本不需要它。总有一种替代方法可以编写不创建延迟对象的代码。
在您使用 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()
已经 return 的承诺,然后链接到它并 return 它。
注意:我还更改了您的代码以使用 .then()
,因为这是 "standard" 的处理方式,并且已被 jQuery 支持。 jQuery 正在转向 jQuery 3.x 中更加符合标准的承诺实现,因此现在开始以这种方式编码是明智的。
如果您确实需要在 jQuery 1.x 或 2.x 中创建您自己的 promise,并且希望尽可能与 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)
});
}
至于什么时候用什么with$.ajax()
,生活有点扑朔迷离。 $.ajax()
支持无数种不同的方式来在完成或出现错误时收到通知。有作为参数传递的直接回调。有 .success()
(现已弃用)。 .done()
类似 promise,但不是标准的。有.then()
这几乎是标准的。
在我看来,使用一种且唯一的方法并使该方法成为 .then()
的标准承诺机制具有巨大的优势。这样一来,您就可以拥有使用 promises 进行异步操作的所有其他优势,包括:
- 能够按顺序将多个异步操作链接在一起。
- 使用
$.when()
或 Promise.all()
之类的东西协调多个异步操作的能力。
- 即使在异步操作中也能保证安全(这将需要 jQuery 3.x 中的 ES6 兼容承诺)。
- 显着增强了错误传播,即使是深度嵌套的异步操作也是如此。
- 一种 "standard" 编码异步操作的方法。
我在 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
}
延迟对象是您用来获取异步操作结果的对象,以便您可以在应用程序的同步流中使用它(如果有意义的话)。任何异步获得的结果都不会立即返回;相反,它们在将来的某个时候可用。延迟对象允许您在这些结果可用时访问它们。
promise 开发的总趋势是不再使用 Deferred 对象或 Deferred 构造函数。事实上,ES6 的 promises 标准甚至不支持这样的事情,因为根本不需要它。总有一种替代方法可以编写不创建延迟对象的代码。
在您使用 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()
已经 return 的承诺,然后链接到它并 return 它。
注意:我还更改了您的代码以使用 .then()
,因为这是 "standard" 的处理方式,并且已被 jQuery 支持。 jQuery 正在转向 jQuery 3.x 中更加符合标准的承诺实现,因此现在开始以这种方式编码是明智的。
如果您确实需要在 jQuery 1.x 或 2.x 中创建您自己的 promise,并且希望尽可能与 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)
});
}
至于什么时候用什么with$.ajax()
,生活有点扑朔迷离。 $.ajax()
支持无数种不同的方式来在完成或出现错误时收到通知。有作为参数传递的直接回调。有 .success()
(现已弃用)。 .done()
类似 promise,但不是标准的。有.then()
这几乎是标准的。
在我看来,使用一种且唯一的方法并使该方法成为 .then()
的标准承诺机制具有巨大的优势。这样一来,您就可以拥有使用 promises 进行异步操作的所有其他优势,包括:
- 能够按顺序将多个异步操作链接在一起。
- 使用
$.when()
或Promise.all()
之类的东西协调多个异步操作的能力。 - 即使在异步操作中也能保证安全(这将需要 jQuery 3.x 中的 ES6 兼容承诺)。
- 显着增强了错误传播,即使是深度嵌套的异步操作也是如此。
- 一种 "standard" 编码异步操作的方法。