首页 > 代码库 > jquery中的promise

jquery中的promise

参考 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

 

从jQuery1.5版本之后 ajax方法进行了重写,和以前不一样了。如今$.ajax()将返回一个Promise/Deffered对象

这个对象里面有done() fail() always()  then() promise()  reject()等方法

 

以前发ajax这么写

 

  $.ajax({

    url: "test.html",

    success: function(){

      alert("哈哈,成功了!");

    },

    error:function(){

      alert("出错啦!");

    }

  });

现在则是

 

    $.ajax({

        url: ‘/path/to/file‘,

        type: ‘default GET (Other values: POST)‘,

        dataType: ‘default: Intelligent Guess (Other values: xml, json, script, or html)‘,

        data: {param1: ‘value1‘},

    }).done(function() {

        console.log("success");

    }).fail(function() {

        console.log("error");

    }).always(function() {

        console.log("complete");

    });

很显然,done()相当于success() fail()就是error()

或者

 

    $.ajax({

        url: ‘test1.json‘,

        dataType: ‘text‘,

    }).then(function(res){

        alert(‘wahha‘);

        console.log(res);

    });

 

 

可以为不同的请求使用相同的回调

$.when($.ajax({

        url: ‘test1.json‘,

        dataType: ‘text‘,

    }),$.ajax({

        url: ‘test2.json‘,

        dataType: ‘text‘,

    })).done(function(res){

    alert(‘wahha both‘);

    console.log(res);//第一个ajax请求的响应

})

 

为普通函数增加回调函数

这是最建议的方式

  var wait = function(dtd){

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

    var tasks = function(){

      alert("执行完毕!");

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

    };

 

    setTimeout(tasks,5000);

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

  };

  $.when(wait())

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

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

源博文先前是将$.Deferred() 当做全局对象,不过那样可以在全局中改变执行的状态。

因此他又用了deferred.promise()

最后用到了是将deferred放在函数内,解决了这个问题

 

所以以后多个嵌套的ajax请求可以这么写

var promiseA = $.get(urlA);

promiseA.always(doneFnA, failFnA, progressFnA);

 

var promiseB = promiseA.then(function(){

    return $.get(urlB);

});

promiseB.always(doneFnB, failFnB, progressFnB);

jquery中的promise