码迷,mamicode.com
首页 > Web开发 > 详细

jquery中的promise

时间:2014-09-15 19:20:39      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   os   使用   ar   问题   sp   cti   

参考 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

标签:blog   http   io   os   使用   ar   问题   sp   cti   

原文地址:http://www.cnblogs.com/cart55free99/p/3973447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!