deferred方法怎么在jQuery项目中使用
在jQuery项目中使用deferred方法需要引入jQuery库,在引入同时需要了解deferred的使用方式和方法。
deferred对象是jQuery的一种特殊对象,它被用来处理异步操作并返回结果,使得异步代码更具有可读性和可维护性。
deferred有4种状态:pending(未完成)、resolved(已完成)、rejected(已失败)、settled(已完成或已失败)。
使用deferred的时候主要有以下几个步骤:
1.创建一个deferred对象
var deferred = $.Deferred();
或者
var deferred = new jQuery.Deferred();
2.执行异步操作
通常来说执行异步操作包括ajax请求、定时器、事件响应等。
$.ajax({
url: 'xxx',
success: function(data){
// 异步执行完成时需要resolve或reject
deferred.resolve(data);
},
error:function(){
deferred.reject();
}
});
3.对结果进行处理
当异步操作执行完成时,我们可以对结果进行处理。使用then()方法可以在异步操作执行成功或失败后分别执行不同的回调函数。
deferred.then(function(data){
// 执行成功时的回调
},function(){
// 执行失败时的回调
});
4.返回结果
异步操作的结果可以通过return语句返回,在调用then()方法的地方进行处理。
return deferred.promise();
详细说明
1.创建一个deferred对象
deferred对象可以通过new jQuery.Deferred()或$.Deferred()方式创建。在项目中 采用$.
var deferred = $.Deferred();
该方法可以返回一个新的空白deferred对象。
deferred对象是jQuery提供的异步编程的实现,通过链式调用来组合和控制异步代码。
2.执行异步操作
异步操作是指操作完成需要一定时间,在此期间,将代码的执行交给其它线程,而使用JavaScript线程处理其它的操作。
$.ajax({
url: 'xxx',
success: function(data){
// 异步执行完成时需要resolve或reject
deferred.resolve(data);
},
error:function(){
deferred.reject();
}
});
$.ajax()是jQuery中的异步方法,通过传入一个参数对象来设置请求的属性和事件处理程序。当请求成功时,执行success回掉函数,即为异步操作执行完成并返回结果,使用resolve()方法将结果传递给then()方法;如果请求失败,则执行error回调函数,即该异步操作执行失败,并使用reject()方法通知then()方法。
deferred.resolve()方法通知其监听者异步操作已经完成,如果有由.then()方法添加的回调函数,它们就会被调用,可以将异步操作返回的数据作为参数传递给resolve()方法。相同的,也可以使用deferred.reject()方法通知其监听着异步操作已经失败。
3.对结果进行处理
当异步操作执行完成时,我们可以对结果进行处理。使用$.Deferred()中.then()方法可以在异步操作执行成功或失败后分别执行不同的回调函数。then()方法接收两个参数,也即区分异步操作执行成功和失败的两个处理方式:
deferred.then(function(data){
// 异步操作执行成功时的回调
},function(){
// 异步操作执行失败时的回调
});
4.返回结果
通过deferred。promise()方法返回一个只读的对象,该对象表示异步操作完成后可用的结果。只读属性被称为约定,在Promises/A+规范的定义中,它是规范中异步操作的核心属性,表示异步操作已启动但未完成。promise()方法可以用于内部链式处理,也可返回给用户,以避免异步操作产生的数据集合发生改变或意外赋值。
$.ajax({
url: 'xxx',
success: function(data){
// 异步执行完成时需要resolve或reject
deferred.resolve(data);
},
error:function(){
deferred.reject();
}
});
return deferred.promise();
使用Deferred对象的好处
将代码从回调接口中解耦,以实现更好的可维护性,使异步代码更具有可读性。
异步操作的代码管理更加有效,将异步操作分配到可读性高的模块。
对于异步操作涉及到多个数据依赖的情况,deferred.pipeline()方法提供了更好的方式。
它提供了非常便捷的功能(当异步操作执行完成後执行其他任务),并且允许创建更通用、更健壮且可复用的业务逻辑。
deferred没有最小依赖,可以轻松地应用于如node.js、angular等其它JavaScript套件。
不足
需要耗费一定的时间和精力来学习deferred对象的使用方法,并适应其编码思想;
高并发下的瓶颈问题;
不同开发语言和库提供的deferred对象方法和规则上存在差异;
对于慢资源和考虑每个回调的开销的单个异步目标,deferred操作可能不是 选择。
结论
Deferred对象通过提供所需的上下文调用来简化异步编程。它通过提供一个像Promise对象的特殊API来处理异步代码,并使其更具可读性和可扩展性。Promises/A+规范定义的Promise对象是JavaScript中异步操作的一种高效解决方案,可以处理复杂的异步操作,使用灵活可读性强,建议在jQuery项目中尝试运用deferred对象实现异步编程的操作。
