最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

jQuery源码之异步机制的解析

来源:动视网 责编:小采 时间:2020-11-27 19:34:00
文档

jQuery源码之异步机制的解析

jQuery源码之异步机制的解析:这篇文章主要介绍了关于jQuery源码之异步机制的解析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下异步机制javascript编程往往会伴随着异步编程,比如远程获取数据,大量的异步编程会带来许多的回调函数,js是单线程的,所以完成异步往往需
推荐度:
导读jQuery源码之异步机制的解析:这篇文章主要介绍了关于jQuery源码之异步机制的解析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下异步机制javascript编程往往会伴随着异步编程,比如远程获取数据,大量的异步编程会带来许多的回调函数,js是单线程的,所以完成异步往往需

var wait = function(dtd){

    var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象

    var tasks = function(){

      alert("执行完毕!");

      dtd.resolve(); // 改变Deferred对象的执行状态

    };

    setTimeout(tasks,5000);

    return dtd.promise(); // 返回promise对象

  };

 var dd = wait();
 // dd.resolve(); // 这里如果使用了的话,就会报错的哦,因为返回deferred.promise()是无法对状态修改的哦
  $.when(dd)

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

八、$.Defferred(wait)

另一种防止执行状态改变的方法是使用$.Defferred()

var dtd = $.Deferred(); // 新建一个Deferred对象

  var wait = function(dtd){

    var tasks = function(){

      alert("执行完毕!");

      dtd.resolve(); // 改变Deferred对象的执行状态

    };

    setTimeout(tasks,5000);

    return dtd;

  };
var ddd = wait();
// dd.resolve(); //这里报错了哦
$.Deferred(dd)

  .done(function(){ alert("哈哈,成功了!"); })

  .fail(function(){ alert("出错啦!"); });

九、defferred对象小结

  • $.Deferred() 生成一个deferred对象。

  • deferred.done() 指定操作成功时的回调函数

  • deferred.fail() 指定操作失败时的回调函数

  • deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。

  • deferred.resolve(args) 手动改变deferred对象的运行状态为"已完成",从而立即触发done()方法。解决Deferred(延迟)对象,并根据给定的args参数调用任何完成回调函数(doneCallbacks)。

  • deferred.resolveWith() 解决Deferred(延迟)对象,并根据给定的 context和args参数调用任何完成回调函数(doneCallbacks)。

  • deferred.reject(args) 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为"已失败",从而立即触发fail()方法。拒绝Deferred(延迟)对象,并根据给定的args参数调用任何失败回调函数(failCallbacks)。这里的args是一个对象。

  • deferred.rejectWith(context, args) 拒绝Deferred(延迟)对象,并根据给定的 context和args参数调用任何失败回调函数(failCallbacks)。这里的args是一个数组类型。

  • $.when() 为多个操作指定回调函数。除了这些方法以外,deferred对象还有二个重要方法,上面的教程中没有涉及到。Context(上下文) 作为 this对象传递给失败回调函数(failCallbacks )

  • deferred.then()

  • 有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。

    $.when($.ajax( "/main.php" ))
    
      .then(successFunc, failureFunc );

    如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。

  • deferred.always() 这个方法也是用来指定回调函数的,它的作用是,不管调用的 deferred.resolve()还`是deferred.reject(),最后总是执行。

  • $.ajax( "test.html" )
    
      .always( function() { alert("已执行!");} );
  • deferred.state() 确定一个Deferred(延迟)对象的当前状态。

    1. "pending": Deferred对象是尚未完成状态 (不是 "rejected" 或 "resolved").

    2. "resolved": Deferred对象是在解决状态,这意味着,deferred.resolve() 或者 deferred.resolveWith()被对象访问和doneCallbacks被访问(或在被调用的过程中)

    3. "rejected": Deferred对象是在被拒绝的状态,这意味着,deferred.reject() 或者 deferred.rejectWith() 被对象访问和failCallbacks被访问(或在被调用的过程中) 。

    这种方法主要是用在调试,例如,在准备拒绝(reject)一个延迟对象前,判断它是否已经处于 resolved 状态。


    十、使用实例

    情景1:当用户按下删除弹窗的确定或取消后,把弹窗隐藏,并执行对应的操作(删除或不执行),因为我们不知道用户什么时候会点击按钮,所以不能让弹窗阻塞其他任务的执行。

    function pop(arg) {
     if (!arg) {
     console.error('pop title is empty');
     }
     var dfd = $.Deferred() //实例化一个延迟对象 
     ,
     confirmed //记录按下确定或取消 
     , $confirm = $content.find('button.confirm') //确认按钮 
     ,
     $cancel = $content.find('button.cancel'); //取消按钮 
    
     //定时器轮询,当按下确定或取消时触发删除或取消操作 
     timer = setInterval(function() {
     if (confirmed !== undifined) {
     dfd.resolve(confirmed);
     clearInterval(timer);
     dismiss_pop();
     }
     }, 50);
     //点击确定时更改confirmed状态 
     $confirm.on('click', function() {
     confirmed = true;
     });
     //点击取消时更改confirmed状态 
     $cancel.on('click', function() {
     confirmed = false;
     }); //返回dfd对象
     return dfd.promise();
     }
     $('.delete').click(function() {
     var $this = $(this);
     var index = $this.data('index');
     //当前的id //确定删除
     pop('确定删除?').then(function(res) {
     res ? delete_task(index) : null;
     })
     })

    文档

    jQuery源码之异步机制的解析

    jQuery源码之异步机制的解析:这篇文章主要介绍了关于jQuery源码之异步机制的解析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下异步机制javascript编程往往会伴随着异步编程,比如远程获取数据,大量的异步编程会带来许多的回调函数,js是单线程的,所以完成异步往往需
    推荐度:
    标签: 代码 源码 异步
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top