美文网首页
deferred方法

deferred方法

作者: 黄小猛 | 来源:发表于2017-03-14 11:40 被阅读0次

    ajax操作链式写法

      $.ajax({
               url: "test.html",
               success: function () {
                     // console.log();
              },
              error: function () {
                     // console.log();
             }
      });
    
    还可以这样写
        $.ajax("test.html")
        .done(function () {console.log();  })
        .fail(function () {  console.log(); })
    
    还可以不断累加done的函数 按顺序执行
    利用when 可以为多个事件指定一个回调函数
        $.when($.ajax('test1.html'), $.ajax('test2.html'))
        .done(function () {console.log() })
        .fail(function () {console.log() });
    

    将deferred推广至所有的函数中

        $.when(wait())
        .done(function () {console.log(); })
        .fail(function () {console.log(); })
    

    when里面的参数必须是deferred对象 wait()函数可以这样写

      var dtd = $.Deferred(); // 新建一个deferred对象
    
      var wait =  function (dtd) {
          var tasks = function () {
              console.log();
               dtd.resolve();  //改变deferred对象的执行状态
          };
          setTimeout(tasks, 5000);
           return dtd;
      }
    
      $.when(wait (dtd))
      .done(function () {})
      .fail(function () {});
    

    "执行环境" deferred对象有三种执行状态 ---未完成,已完成,已失败

    如果执行状态是“已完成”(resolved), deferred对象立即调用done()方法指定的回调函数,
    如果执行状态是“已失败”(reject),调用fail()方法指定的回调函数;

    如果执行状态是“未完成”,则继续等待,或者调用progress()方法指定的回调函数

                  // 备注 感觉有点像观察者模式 
    

    缺陷:

    dtd是全局变量,所以dtd中的状态可以从外部被改变,引进deferred.promise()方法 来改变这一缺陷

    promise的作用是在原来的deferred对象上返回另一个deferred对象,后者只开放与改变执行状态无关的方法,比如done和fail,屏蔽与改变执行状态有关的方法,从而使得执行状态不能被改变

      var dtd = $. Deferred(); // 新建一个Deferred对象
      
      var wait = function (dtd) {
          var tasks = function () {
                  console.log();
                  dtd.resolve(); // 改变Deferred对象的执行状态
          };
    
          setTimeout(tasks, 5000);
          return dtd.promise();
      };
    
      var d = wait(dtd);
    
      $.when(d)
       .done(function () {console.log();  })
       .fail(function () {console.log(); });
    
       d.resolve(); // 此时这个语句是无效的
    
    一种更好的办法就是不让dtd是全局变量,在wait函数内部定义        deferred对象
    

    一种更加简便的方式是直接将wait函数传入$.Deferred()中 (是传入一个函数名)

       $.Deferred(wait)
       .done(function () { })
       .fail(function () { });
    

    还可以直接在wait对象上部署deferred接口

        var dtd = $.Deferred();
        var wait = function (dtd) {
              var tasks = function () {
                  console.log();
                  dtd.resolve();
              }
    
            setTimeout(tasks, 5000);
        };
    
      dtd.promise(wait); // 可以给wait函数直接绑定一个deferred接口
      wait.done(function() {})
            .fail(function () {});
    
      wait(dtd);
    

    相关文章

      网友评论

          本文标题:deferred方法

          本文链接:https://www.haomeiwen.com/subject/kimcnttx.html