中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

詳解Jquery高級應用Deferred對象

發布時間:2020-07-21 11:21:07 來源:億速云 閱讀:105 作者:小豬 欄目:web開發

小編這次要給大家分享的是詳解Jquery高級應用Deferred對象,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

在實際開發中常常遇到這樣的問題:B函數中需要用到的變量或者參數,只有等A函數執行完畢了才能獲取到。比如A函數中有一個ajax請求,而B函數中所需要的position變量需要在A函數中ajax請求完成才能得到它的準確值。

function A() {
  $.ajax({
    url: '/api/test',
    type: 'POST',
    data: {...},
    success: function(res) {
      position = res.position;
    }
  })
}

function B() {
  $('.test').text(position);
}

JavaScript的異步模式讓B函數不會等待A函數計算出了position的值才會執行,它會不等待A函數的結果而直接開始執行,這樣就會造成position無法正確賦值。為了解決這個問題,我們很容易想到使用回調函數,這也是最常用的方法之一

function A(callback) {
  $.ajax({
    url: '/api/test',
    type: 'POST',
    data: {...},
    success: function(res) {
      position = res.position;
      callback && callback();
    }
  })
}

function B() {
  $('.test').text(position);
}

A函數有了回調之后,就可以將B函數當做回調函數傳遞給A

A(B);

可是如果這個時候,還有一個C函數,依賴于B的執行結果呢,后面甚至有可能出現一個D函數,依賴于C的結果!又如我們常用的ajax,成功了會有一個回調函數,失敗了還有一個回調函數,面對這樣復雜的情況,我們應該怎么樣處理?雖然使用回調函數依然能夠搞定這些煩人的難題,但是很顯然這并不是一個好的解決辦法。

jquery中的Deferred對象很好的解決了這個問題。在了解Deferred之前,我們可能需要了解一個JavaScript中的promise模式。當我們使用回調來解決實際中的問題時,很容易不知不覺中出現代碼金字塔

step1(function() {
  step2(function() {
    step3(function() {
      step4(function() {
        step5();
      })
    })
  })
})

假如這個時候有一個js庫實現了promise模式,那么我們的代碼就會變得清晰可讀,并且每一步都會等待上一步執行完畢了才會執行。

new Promise().when(promiseStep1)
.then(promiseStep2)
.then(promiseStep3)
.then(promiseStep4)
.then(promiseStep5);

每一個promise對象都可以設置三種狀態:

  • pending [進行中]
  • resolve [已經正確執行]
  • reject [執行失敗]

關于promise,還有更多需要了解的地方,我這里只是拋磚引玉。回到jQuery的Deferred對象來。jquery的Deferred對象就是對promise模式的一個很好的實現案例。我們通過一個簡單的例子來看看Deferred對象應該如何使用。

函數first是一個耗時兩秒的操作,而函數second是一個簡單的函數,但是他需要在first執行完畢之后才執行。

function first() {
  setTimeout(function() {
    console.log('first');
  }, 2000);
}
function second() {
  console.log('second');
}
為了達到second在first之后執行,使用Deferred對first函數做一個簡單的處理即可
function first() {
  // 1
  var defer = $.Deferred();
  setTimeout(function() {
    console.log('first');
    // 2
    defer.resolve();
  }, 2000);
  
  // 3
  return defer.promise();
}

1、在函數中聲明一個Deferred對象,這樣在外部就無法修改函數內部的執行狀態

2、函數執行完畢,設置執行狀態,如果成功執行,defer.resolve(),如果執行失敗,則設置為defer.reject()

3、在函數的最后,必須將deferred對象返回出去,否則外部無法得到函數的執行結果

在做了這樣的處理之后,我們就可以滿足要求的正常使用了

$.when(first())
.done(second());

jquery中,ajax方法就是使用promise模式完成的,我們可以看看常規寫法和Deferred對象寫法的不同。

// 常規寫法
 $.ajax({
   url: '/api/test',
   type: 'POST',
   data: {...},
   success: function(res) {
     // dosomething
   },
   fail: function(res) {
     // dosomething
   },
   complete: function() {
     // dosomething
   }
 })

// 新的寫法
$.ajax({
   url: '/api/test',
   type: 'POST',
   ...
 })
 .done(function(res) {
   // success and do something
 })
 .fail(function(res) {
   // fail and do something
 })
 .always(function() {})

這個知識點差不多就總結完畢了。Promise模式與Deferred對象都還有更多值得了解知識點與用法,這是一個非常值得掌握的神兵利器,建議大家搜索更多的文章來學習它。

看完這篇關于詳解Jquery高級應用Deferred對象的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

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

AI

白河县| 涟水县| 中牟县| 威远县| 石嘴山市| 通化市| 虞城县| 长葛市| 田林县| 仙桃市| 长春市| 天峻县| 中卫市| 朝阳区| 东山县| 石屏县| 寿阳县| 额尔古纳市| 平南县| 大宁县| 许昌县| 兴宁市| 广东省| 新田县| 泸溪县| 仁化县| 宣恩县| 三江| 股票| 当阳市| 桐柏县| 盘锦市| 安泽县| 海南省| 大新县| 开封市| 青龙| 紫金县| 南京市| 大石桥市| 新营市|