deferred方法

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方法)