最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jQuery中的deferred使用方法

 更新時間:2017年03月27日 09:50:50   投稿:mrr  
deferred對象是jQuery的回調函數(shù)解決方案,jQuery之前的版本中異步回調這塊做的不是很好,所以后期補上了該解決方案。接下來通過本文給大家介紹jQuery中的derferred使用方法,非常不錯,需要的朋友參考下

deferred簡介

deferred對象是jQuery的回調函數(shù)解決方案,jQuery之前的版本中異步回調這塊做的不是很好,所以后期補上了該解決方案。

普遍的ajax操作方式

我們先來回顧一下jQuery中普通的ajax操作

$.ajax({
 url: 'test.html',
 success: function (res) {
 console.log('數(shù)據(jù)讀取成功');
 },
 error: function () {
 console.log('數(shù)據(jù)讀取失敗');
 }
});

1.5版本后的新寫法如下:

$.ajax('test.html').done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
});

新版本的寫法相比老版本有一個優(yōu)勢,就是可以自由添加多個回調函數(shù)并且按照添加順序執(zhí)行:

$.ajax('test.html').done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
}).done(function (res) {
 console.log('這是第二個成功的回調函數(shù)');
});

為多個ajax指定回調函數(shù)

我們可以通過when方法,為多個事件指定一個回調函數(shù)

$.when($.ajax('test.html'), $.ajax('test2.html')).done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
});

為普通函數(shù)指定回調函數(shù)

前面說到的when是用于ajax方法,而ajax其實是deferred對象,如果不是ajax對象,換成普通的函數(shù)呢,直接使用when是不會有效果的,會直接執(zhí)行done方法

所以我們需要手動新建一個deferred對象

var defer = $.deferred(); //新建一個deferred對象
var wait = function (defer) {
 var tasks = function () {
  console.log('執(zhí)行完畢!');
  defer.resolve(); //改變deferred對象的執(zhí)行狀態(tài) - 成功
 };
 setTimeout(tasks, 5000);
 return defer;
};

這里的resolve就是觸發(fā)done的,對應的reject方法則是用來調用fail方法的。

var defer = $.deferred(); //新建一個deferred對象
var wait = function (defer) {
 var tasks = function () {
  console.log('執(zhí)行完畢!');
  defer. reject(); //改變deferred對象的執(zhí)行狀態(tài) - 失敗
 };
 setTimeout(tasks, 5000);
 return defer;
};

執(zhí)行方法

$.when(wait(defer)).done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
});

進一步優(yōu)化

上面的代碼還有一些問題,defer是暴露在全局的,所以我們是可以通過在全局進行defer.resolve()來提前回調。

為了避免這種情況,jQuery提供了deferred.promise()方法,它的作用是在原來的deferred對象上返回另一個deferred對象,后者只開放與改變執(zhí)行狀態(tài)無關的方法(比如done方法和fail方法)屏蔽與改變執(zhí)行狀態(tài)有關的方法(比如resolve和reject方法)。

var defer = $.deferred(); //新建一個deferred對象
var wait = function (defer) {
 var tasks = function () {
  console.log('執(zhí)行完畢!');
  defer.resolve(); //改變deferred對象的執(zhí)行狀態(tài) - 成功
 };
 setTimeout(tasks, 5000);
 return defer.promise();
};
$.when(wait(defer)).done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
});

也可以把defer包在函數(shù)中

// 普通方法
var wait = function () {
 var defer = $.deferred(); //新建一個deferred對象
 var tasks = function () {
  console.log('執(zhí)行完畢!');
  defer.resolve(); //改變deferred對象的執(zhí)行狀態(tài) - 成功
 };
 setTimeout(tasks, 5000);
 return defer.promise();
};
$.when(wait()).done(function (res) {
 console.log('數(shù)據(jù)讀取成功');
}).fail(function () {
 console.log('數(shù)據(jù)讀取失敗');
});
// 執(zhí)行異步
var setAjax = function () {
 var defer = $.Deferred();
 if (xhr) {
  xhr.abort();
  xhr = null;
 }
 var xhr = $.ajax({
  url: 'test.html',
  success: function (res) {
   console.log('數(shù)據(jù)讀取成功');
   defer.resolve(res);
  },
  error: function () {
   console.log('數(shù)據(jù)讀取失敗');
   defer.reject();
  }
 });
 return defer.promise();
}
$.when(setAjax()).then(function (res) {
 console.log('數(shù)據(jù)讀取成功', res);
}, function () {
 console.log('數(shù)據(jù)讀取失敗');
});

以上所述是小編給大家介紹的jQuery中的derferred使用方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

最新評論

原阳县| 突泉县| 富阳市| 太保市| 西乌珠穆沁旗| 论坛| 正宁县| 章丘市| 年辖:市辖区| 冀州市| 青神县| 工布江达县| 灵宝市| 延吉市| 凤城市| 布尔津县| 东丽区| 昌宁县| 册亨县| 乌拉特中旗| 佛山市| 卢龙县| 博湖县| 青浦区| 曲水县| 荆州市| 长乐市| 务川| 河源市| 清水河县| 弋阳县| 晋州市| 原平市| 洛阳市| 楚雄市| 白朗县| 郧西县| 仁化县| 德钦县| 会宁县| 云和县|