成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Promise對象的基礎入門學習

開發 前端
Promise對象是CommonJS工作組提出的規范。Promise原本只是社區提出的構想,一些外部函數庫率先實現了該功能,ES6中將其寫入了語言標準。Promise是啥,它就是一個javascript中一個對象,起著代理作用,充當異步操作與回調函數之間的中介。

[[171668]]

今天來學習下Promise吧!其實這在筆試上也是一個考點。

基本介紹

Promise對象是CommonJS(熟悉的名字吧- -)工作組提出的規范.Promise原本只是社區提出的構想,一些外部函數庫率先實現了該功能,ES6中將其寫入了語言標準.

目的:為異步操作提供統一接口

Promise是啥,它就是一個javascript中一個對象,起著代理作用,充當異步操作與回調函數之間的中介。

避免類似于

 

這種嵌套地獄的產生.讓我們的代碼變得更加簡單易讀使用了Promise,大家都說好

  1. (new Promise(f1).then(f2)); 

總結:Promise使得異步操作的向下發展變成橫向發展,程序流程變得清晰,易于閱讀。

基本思想

  • 異步任務返回一個Promise對象,它有三種狀態

1.pending(未完成)

2.resolved,fulfilled(已完成)

3.rejected(失敗)

  • 它有兩種變化途徑

1.pending --> resolved/fulfilled

2.pending --> rejected

  • 它有兩種結果

1.異步操作成功,返回一個值,狀態變為resolved

2.異步操作失敗,拋出一個錯誤,狀態變為rejected

Promise使用.then()方法添加回調函數,then接收兩個回調函數,***個為成功時的回調函數,另一個為失敗時的回調函數.主要為狀態改變時調用相對的回調函數.

而且then可以鏈式調用。

基本使用

Promise構造函數接受一個函數作為參數,而該函數兩個參數分別是resolve和reject.它們由JS引擎提供,不需要自己部署.

  1. Promise(function(resolve,reject){}) 

resolve函數作用為:將Promise對象從未完成變為成功(Pending->Resolved),異步操作成功時調用,并將異步操作的結果作為參數傳遞出去.

reject函數作用為:將Promise對象從未完成變為失敗(Pending->Rejected),異步操作失敗時調用,并將異步操作報出的錯誤作為參數傳遞出去.

Promise.then()方法可以用于指定Resolved狀態和Reject狀態的回調函數.

  1. promise.then(function(value){//成功+_+!},function(value){//失敗Q_Q}); 

我們只想對異常進行處理時可以采用promise.then(undefined, onRejected)這種方式,或者promise.catch(onRejected)

!注意!此處有坑,接下來在深入節會進行講解

Promise.all()方法接收一個promise對象的數組為參數,當這個數組中所有的Promise對象全部變成resolve/reject狀態的時候,才會調用.then方法,其中傳入的promise是同時開始,并行執行的。

  1. promise.all([promise1,promise2,.....]); 

Promise.race()方法和Promise.all()方法一樣接收一個promise對象的數組作為參數,但是數組中有一個promise對象進入fulfilled或rejected狀態,就會開始后續處理. 

  1. promise.race([promise1,promise2,.....]); 

相關的語法糖 

  1. Promise.resolve(42); 
  2. //等價于 
  3. new Promise(function(resolve){ 
  4.     resolve(42); 
  5. }); 
  6.  
  7. Promise.reject(new Error("出錯了")); 
  8. //等價于 
  9. new Promise(function(resolve,reject){ 
  10.     reject(new Error("出錯了")); 
  11. });  

深入

關于Thenable對象

這是非常類似于Promise的東西,擁有.then方法.

其中比較經典的例子就是jQuery.ajax()返回的值就是thenable的. 

  1. var promise = Promise.resolve($.ajax('/json/comment.json')); 

這樣就可以將thenable對象轉化為promise對象

傳送門:Promise.resolve()

關于promise設計:總是異步操作

看代碼就能明白這個地方的問題了. 

  1. var promise = new Promise(function (resolve){ 
  2.     console.log("inner promise"); // 1 
  3.     resolve(42); 
  4. }); 
  5. promise.then(function(value){ 
  6.     console.log(value); // 3 
  7. }); 
  8. console.log("outer promise"); // 2 
  9. //結果是 
  10. /* 
  11. inner promise // 1 
  12. outer promise // 2 
  13. 42            // 3 
  14. */  

可以看出,即使我們調用promise.then時promise對象已經確定狀態,Promise也會以異步的方式調用回調函數,這就是Promise設計上的規定方針.

關于調用then/catch

每次調用then/catch,都會返回一個promise對象,這一點上我們通過使用===就可以判斷出來每次promise對象其實都是不一樣的

then和catch的錯誤處理區別

這點和上一點聯合起來很容易理解

直接上圖吧,來自于JavaScript Promise迷你書(中文版)

 在結合我們的代碼吧 

  1. // <1> onRejected不會被調用 
  2. function badMain(onRejected) { 
  3.     return Promise.resolve(42).then(throwError, onRejected); 
  4. // <2> 有異常發生時onRejected會被調用 
  5. function goodMain(onRejected) { 
  6.     return Promise.resolve(42).then(throwError).catch(onRejected); 
  7.  

onFullfilled中發生的錯誤,如在<1>里面throwError中的錯誤,是不會導致onRejected的執行(捕獲異常)的,我們只能通過后面的catch方法才能捕獲.

基本應用

不兼容方面

  1. 不兼容就是用polyfill吧
  2. 關于IE8以及以下版本中,catch會由于在ES3中為保留字,導致identifier not found錯誤,對此我們可以通過["catch"]或者then(undefined,function(){})來進行catch,而某些類庫中,采用了caught作為函數名來規避該問題.值得注意的是,有很多壓縮工具中自帶了.catch轉["catch"]

應用示例:

加載圖片 

  1. var preloadImage = function(path){ 
  2.   return new Promise(function(resolve,reject){ 
  3.     var image = new Image(); 
  4.     image.onload = resolve; 
  5.     image.onerror = reject; 
  6.     image.src = path; 
  7.   }) 
  8. preloadImage("https://dn-anything-about-doc.qbox.me/teacher/QianDuan.png").then(function(){ 
  9.   alert("圖片加載成功"); 
  10. },function(){ 
  11.   alert("圖片加載失敗"); 
  12. })  

Ajax操作 

  1. function search(term) { 
  2.     var url = 'http://example.com/search?q=' + term; 
  3.     var xhr = new XMLHttpRequest(); 
  4.     var result; 
  5.     var p = new Promise(function(resolve, reject) { 
  6.         xhr.open('GET', url, true); 
  7.         xhr.onload = function(e) { 
  8.             if (this.status === 200) { 
  9.                 result = JSON.parse(this.responseText); 
  10.                 resolve(result); 
  11.             } 
  12.         }; 
  13.         xhr.onerror = function(e) { 
  14.             reject(e); 
  15.         }; 
  16.         xhr.send(); 
  17.     }); 
  18.     return p; 
  19. search("Hello World").then(console.log, console.error);  

回到最初吧,其實Promise對象優點還是在于規范的鏈式調用,可以清晰看出程序流程.并且對于錯誤還能定義統一的處理方法。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-04-22 22:26:13

Java語言IT

2018-07-11 13:33:43

大數據人工智能Hadoop

2010-06-18 09:57:46

C#UML基礎

2021-01-28 08:34:30

Java對象定義

2021-01-18 08:52:28

Java對象多態

2011-09-27 13:52:41

2009-07-03 14:31:43

學習JSP

2024-07-09 09:33:18

2020-12-24 08:36:14

JavaJava基礎

2017-09-04 22:41:31

深度學習矩陣運算代碼

2017-09-18 10:48:06

深度學習零基礎入門

2011-02-24 11:10:33

Konqueror

2012-02-29 00:00:43

Linux鳥哥

2020-07-29 17:35:08

Promise源碼前端

2011-07-06 14:12:14

Objective-C

2009-06-17 09:58:48

JBoss Rules

2023-09-15 15:31:23

異步編程Promise

2022-02-22 19:04:01

Perl編程語言

2020-11-16 16:13:06

網絡安全互聯網滲透測試

2022-01-21 08:50:15

Promise任務隊列前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av视频在线观看 | 视频一区二区在线观看 | 久久久久久成人 | 久热久草 | 国产一区黄色 | 在线视频 亚洲 | 超碰操| av电影一区 | 精品欧美一区二区精品久久 | 欧美成视频 | 欧美精品在线观看 | 欧美综合一区二区 | 热久久久| 超碰人人人人 | 狠狠狠干 | 色视频网站在线观看 | 美女精品一区 | 免费视频一区二区 | 欧美亚洲网站 | 国产精品一区二区在线 | 色综合天天网 | 在线观看国产精品视频 | 羞羞在线观看视频 | 久久久.com| 三级黄色片在线播放 | 国产精品成人在线 | 午夜视频一区 | 天天综合干| 成人一区二区三区在线观看 | 久久久青草婷婷精品综合日韩 | 九九亚洲 | 久久6| 国产日韩欧美在线观看 | 在线观看的av | 罗宾被扒开腿做同人网站 | 国产精品综合 | 久久久久国产精品一区 | 国产一区二区精品在线 | 伊人久久在线 | 91亚洲精选 | 波多野吉衣在线播放 |