JQ的deferred对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a250758092/article/details/80454092

首先列出以下会涉及到的,该对象的一些方法的使用或相关联的其他方法,

  • deferred.done()
  • deferred.fail()
  • deferred.catch()
  • deferred.then()
  • $.when()
  • deferred.notify()
  • deferred.progress()
  • deferred.resolve()
  • deferred.reject()
  • deferred.always()

Deferred对象是Jquery 1.5版本以后添加进去的,直译为 延迟对象,是为了解决回调函数的一个方案,所有的回调函数都会针对这个对象进行处理

$.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR对象,你没法进行链式操作;如果高于1.5.0版本,返回的是deferred对象,可以进行链式操作。

在旧版本的JQ 里面,写回调函数是这样的:

$.ajax({
success:function(){},
error:function(){}

})

所有的回调函数都写在参数里面。而新版本的JQ,则默认AJAX请求返回的是一个Deferred对象,这样我们就能做链式操作,像这样:

$.ajax({}).done(function(){}).fail(function(){})

Deferred “延迟”就是为了解决 异步回调的问题。
异步操作,除了AJAX请求以外,还有setimeout,setinterval以及其他触发事件,都属于异步操作。具体的Deferred对象的意义请自行了解。直接进入这个对象的各个方法:

  • done
    done方法在deferred对象解决(deferred.resolve())之后的执行,相当于AJAX以前的success

  • fail
    deferred.reject()之后执行,相当于ajax的error

  • catch()
    个人还没区分它与fail的区别。。。

  • then()
    then有两个参数then(Function ,Function)第一个对应done,第二个对应fail,所以只有一个函数作为参数的时候等同于done
  • $.when()
    when是为了使多个异步操作绑定同一个回调函数
$.when($.ajax(),$.ajax(),...).done(function(){}).fail(function(){})
//只有当所有的请求都完成后才会执行后面的done方法,只要存在一个没有完成,都不会执行
  • notify(), progress()
    notify是通知progress中的回调函数,如:
var notifyDeferred=$.Deferred();
notifyDeferred.progress(function(cur){
    console.log('当前进度:'+cur+'%');

});

var wait=function(){
    var def=$.Deferred();
 var tasks = function(){

                    notifyDeferred.notify(100);
                    def.resolve();
    };
setTimeout(tasks,5000);
return def.promise();
}

var wait2=function(def){
    var def=$.Deferred();
    notifyDeferred.notify(50);
    def.resolve();
    return def.promise();
}

$.when(wait(),wait2()).done(function(){
console.log('进度提醒完成')
}).fail(function(){

console.log('未全部完成')
})
  • resolve()
    将deferred对象状态更改为已解决
  • reject()
    将deferred对象状态更改为未解决
  • always()
    无论延迟对象最终结果都会执行这个函数

猜你喜欢

转载自blog.csdn.net/a250758092/article/details/80454092