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

如何利用Promises編寫更優(yōu)雅的JavaScript代碼

 更新時間:2016年05月17日 09:42:12   投稿:jingxian  
如何利用Promises編寫更優(yōu)雅的JavaScript代碼?下面小編就為大家?guī)硪黄肞romises編寫更優(yōu)雅的JavaScript代碼。希望對大家有所幫助。一起跟隨小編過來看看吧

你可能已經無意中聽說過 Promises,很多人都在討論它,使用它,但你不知道為什么它們如此特別。難道你不能使用回調么?有什么了特別的?在本文中,我們一起來看看 Promises 是什么以及如何使用它們寫出更優(yōu)雅的 JavaScript 代碼。

Promises 易于閱讀

比如說我們想從 HipsterJesus 的API中抓取一些數據并將這些數據添加到我們的頁面中。這些 API 的響應數據形式如下:

{ 
 "text": "<p>Lorem ipsum...</p>", 
 "params": { 
 "paras": 4, 
 "type": "hipster-latin" 
}} 

要使用回調的話,我們通常要寫如下形式的東西:

$.getJSON('http://hipsterjesus.com/api/', function(data) { 
 $('body').append(data.text); 
}); 

如果你有 jQuery 的使用經歷,你會認出我們創(chuàng)建了一個 GET 請求并且希望響應內容是 JSON。我們還傳遞了一個回調函數來接受響應的 JSON,以將數據添加到文檔中。

另外一種書寫方法是使用 getJSON 方法返回的 promise 對象。你可以直接在這個返回對象上綁定一個回調。

var promise = $.getJSON('http://hipsterjesus.com/api/');promise.done(function(data) { 
 $('body').append(data.text); 
}); 

在上面的回調例子中,當響應成功時它將 API 請求的結果添加到文檔中。但當響應失敗是會發(fā)生什么呢?我們可以在我們的 promise 上綁定一個失敗處理器。

var promise = $.getJSON('http://hipsterjesus.com/api/');promise.done(function(data) { 
 $('body').append(data.text);});promise.fail(function() { 
 $('body').append('<p>Oh no, something went wrong!</p>'); 
}); 

大多數人刪掉了 promise 變量,這樣更簡潔,一眼就能看出代碼的作用。

$.getJSON('http://hipsterjesus.com/api/').done(function(data) { 
 $('body').append(data.text);}).fail(function() { 
 $('body').append('<p>Oh no, something went wrong!</p>'); 
}); 

jQuery 也包含一個一直發(fā)生的事件處理器,不論請求成功失敗都會被調用。

$.getJSON('http://hipsterjesus.com/api/').done(function(data) { 
 $('body').append(data.text);}).fail(function() { 
 $('body').append('<p>Oh no, something went wrong!</p>');}).always(function() { 
 $('body').append('<p>I promise this will always be added!.</p>'); 
}); 

通過使用promise,回調的順序是按預期的。我們能確保正?;卣{先被調用,然后是失敗回調,最后是一直發(fā)生的回調。

更好的 API

比如說我們想創(chuàng)造一個 HipsterJesus API 的封裝對象。我們會添加一個方法——html,它將來自 API 的 HTML 數據返回。與之前設置一個回調處理器來解析請求不同,我們可以讓方法返回一個 promise 對象。

var hipsterJesus = { 
 html: function() { 
  return $.getJSON('http://hipsterjesus.com/api/').then(function(data) { 
   return data.text; 
  }); 
}}; 

這個做法很酷,這樣我們可以繞過 promise 對象而不必擔心何時或如何解析它的值。任何需要 promise 返回值的代碼只需注冊一個成功響應回調即可。

then方法允許我們修改promise的結果并將其傳遞給鏈中的下一個處理器。這意味現在我們可以這樣使用新的API:

hipsterJesus.html().done(function(html) { 
 $("body").append(html); 
}); 

直到最近,AngularJS 出現了一個殺手級特性,模板可以直接綁定到promise。在Angular的控制器中,像這樣:

$scope.hipsterIpsum = $http.get('http://hipsterjesus.com/api/'); 

這樣,在模板中寫 {{ hipsterIpsum.text }} 就很簡單了。當 promise 解析后,Angular 不需要自動更新視圖。不幸的是 Angular 團隊已經放棄了這一特性。現在,它可以通過調用 $parseProvider.unwrapPromises(true) 來啟用。我希望Angular已經其他框架一直包含此特性(我會一直留意)。

鏈式調用

Promise 最出彩的部分是你可以將它們串聯(lián)起來。比如說我們想添加一個方法到一個返回一段數組的 API。

var hipsterJesus = { 
 
 html: function() { 
  return $.getJSON('http://hipsterjesus.com/api/').then(function(data) { 
   return data.text; 
  }); 
 }, 
 
 paragraphs: function() { 
  return this.html().then(function(html) { 
   return html.replace(/<[^>]+>/g, "").split(""); 
  }); 
 }}; 

我們以上面的方式這種 HTML 方法,我們用它在 paragraphs 方法中。因為promise回調函數的返回值將傳遞給鏈中的下一個回調,我們能夠在通過它們時自由地創(chuàng)建小的、功能性的方法來改變數據。

我們可以按需求任意次串聯(lián)promise。讓我們添加一個。

var hipsterJesus = { 
 
 html: function() { 
  return $.getJSON('http://hipsterjesus.com/api/').then(function(data) { 
   return data.text; 
  }); 
 }, 
 
 paragraphs: function() { 
  return this.html().then(function(html) { 
   return html.replace(/<[^>]+>/g, "").split(""); 
  }); 
 }, 
 
 sentences: function() { 
  return this.paragraphs().then(function(paragraphs) { 
   return [].concat.apply([], paragraphs.map(function(paragraph) { 
    return paragraph.split(/. /); 
   })); 
  }); 
 }};  

多個調用

可能 promise 最顯著的特點是調用多個 API 的能力。當使用回調時,如果你需要同時創(chuàng)建兩個API調用時會發(fā)生什么呢?你可能會這樣寫:

var firstData = null;var secondData = null;var responseCallback = function() { 
 
 if (!firstData || !secondData) 
  return; 
 
 // do something}$.get("http://example.com/first", function(data) { 
 firstData = data; 
 responseCallback();});$.get("http://example.com/second", function(data) { 
 secondData = data; 
 responseCallback(); 
}); 

使用 promise 的話,這就簡單多了:

var firstPromise = $.get("http://example.com/first"); 
var secondPromise = $.get("http://example.com/second"); 
$.when(firstPromise, secondPromise).done(function(firstData, secondData) { 
 // do something 
}); 

這里我們使用 when 方法,將其綁定到一個供兩個請求都完成時調用的處理器上。

結論

這就是 Promise。希望你馬上就想到一些可以用 Promise 實現的的可怕的事情。你最喜歡使用它們的方式是什么?在評論中告訴我吧!

*注:為簡單起見,本文使用了jQuery的延期執(zhí)行。jQuery 的 Deferred對象 和 Promises/A+的規(guī)范 間有細微的差別,這個規(guī)范更標準。

以上這篇如何利用Promises編寫更優(yōu)雅的JavaScript代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • js動態(tài)生成form 并用ajax方式提交的實現方法

    js動態(tài)生成form 并用ajax方式提交的實現方法

    下面小編就為大家?guī)硪黄猨s動態(tài)生成form 并用ajax方式提交的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • 詳解JavaScript進度管理

    詳解JavaScript進度管理

    這篇文章主要介紹了JavaScript進度管理,對進度管理感興趣的同學,可以參考下
    2021-04-04
  • 徹底搞懂JS無縫滾動代碼

    徹底搞懂JS無縫滾動代碼

    徹底搞懂JS無縫滾動代碼...
    2007-01-01
  • 微信企業(yè)號開發(fā)之微信考勤Cookies的使用

    微信企業(yè)號開發(fā)之微信考勤Cookies的使用

    使用微信考勤,每次使用微信企業(yè)號開發(fā):微信用戶信息和web網頁的session的關系這個里邊的方法,調用微信的接口,有點慢,微信官方也推薦使用Cookies,但如何使用Cookies,自己卻一直沒有搞清楚。下面小編幫大家解決難題,需要的朋友可以參考下
    2015-09-09
  • js模擬滾動條(橫向豎向)

    js模擬滾動條(橫向豎向)

    js模擬滾動條(橫向豎向),需要的朋友可以參考一下
    2013-02-02
  • bootstrap 路徑導航 分頁 進度條的實例代碼

    bootstrap 路徑導航 分頁 進度條的實例代碼

    本文通過實例代碼給大家介紹了bootstrap 路徑導航 分頁 進度條的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • Bootstrap CSS布局之按鈕

    Bootstrap CSS布局之按鈕

    這篇文章主要介為大家詳細紹了Bootstrap CSS布局之按鈕的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解JavaScript基于面向對象之創(chuàng)建對象(1)

    詳解JavaScript基于面向對象之創(chuàng)建對象(1)

    這篇文章主要介紹了JavaScript基于面向對象之創(chuàng)建對象,對創(chuàng)建對象進行了詳細描述,感興趣的小伙伴們可以參考一下
    2015-12-12
  • uniapp實現滾動觸底加載項目實戰(zhàn)

    uniapp實現滾動觸底加載項目實戰(zhàn)

    這篇文章主要為大家介紹了uniapp實現滾動觸底加載項目實戰(zhàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 詳解webpack 入門與解析

    詳解webpack 入門與解析

    這篇文章主要介紹了詳解webpack 入門與解析,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

罗山县| 迭部县| 陇南市| 乌拉特中旗| 东台市| 钟祥市| 渑池县| 江山市| 上栗县| 吉水县| 邓州市| 中牟县| 扬州市| 图们市| 双鸭山市| 沂水县| 汾阳市| 马关县| 大方县| 广丰县| 徐汇区| 邻水| 平远县| 方正县| 米脂县| 南川市| 三都| 尉氏县| 长武县| 平阴县| 静宁县| 连州市| 大关县| 河东区| 海阳市| 嵩明县| 樟树市| 武夷山市| 文成县| 盐亭县| 宁夏|