91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

deferred方法怎么在jQuery項目中使用

發布時間:2021-01-14 15:51:41 來源:億速云 閱讀:167 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關deferred方法怎么在jQuery項目中使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

deferred簡介

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

deferred方法怎么在jQuery項目中使用

普遍的ajax操作方式

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

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

1.5版本后的新寫法如下:

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

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

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

為多個ajax指定回調函數

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

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

為普通函數指定回調函數

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

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

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

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

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

執行方法

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

進一步優化

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

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

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

也可以把defer包在函數中

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

關于deferred方法怎么在jQuery項目中使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏山县| 天全县| 浦东新区| 天长市| 任丘市| 宝山区| 读书| 百色市| 杭州市| 平定县| 灵山县| 西城区| 田阳县| 灵武市| 遂昌县| 揭东县| 喀喇| 山东| 鄂托克旗| 榕江县| 临江市| 邓州市| 甘谷县| 鸡东县| 洛阳市| 尉氏县| 邹平县| 青阳县| 额尔古纳市| 正蓝旗| 杭锦后旗| 栾城县| 南江县| 平顶山市| 克东县| 顺义区| 湄潭县| 高安市| 河北区| 宁德市| 怀化市|