JS promise對象

Promise 承諾數組

一:promise概念promise

  在js中,promise是一個對象,是專門用來處理異步操做 / 回調地獄的,那麼什麼是回調地獄?涉及到同步和異步任務的知識,在js中,由於js是單線程,沒法多併發處理任務,當在js中運行代碼時,首先會優先執行同步代碼,而異步代碼則必須等到同步代碼所有執行完纔會被執行,那麼每一個異步代碼的加載都須要時間,有快有慢,當咱們需求讓異步按照咱們本身的開發想法來運行,顯然須要進行嵌套才能讓異步任務有序的按照咱們本身的想法執行,就是在這一不斷嵌套的過程當中,就會造成回調地獄,一不便於管理,代碼耦合嚴重,二代碼很是難看,那麼promise的出現就解決了這回調地獄的帶來的很差的體驗。併發

二:promise的特色  異步

  1:在promise中,總共有三種狀態,分別是準備中(pending),成功時(resolved)和失敗時(rejected)函數

  2:一但建立,狀態當即時pending,只有異步返回的結構能夠改變其狀態,且只能由pending—>resolved 或者 pending -->rejected,沒有其餘狀況spa

三:promise的語法和方法線程

  (1):使用promise時,須要使用 new 出來code

 1 var pms = new Promise(function(resolve,reject){
 2     var i = 3;
 3     if(i>3){
 4         // resolve 表示正確完成時執行的函數
 5         resolve();
 6     }else{
 7         // reject 表示失敗時執行的函數
 8         reject();
 9     }
10 })
11 // 調用 promise 下的兩個回調函數 - then 方法
12 pms.then(function(){
13     // 當正確時執行
14     console.log('執行resolve回調函數');
15 },function(){
16     // 當失敗時執行
17     console.log('執行reject回調函數');
18 })

  Promise對象的回調函數下有兩個參數,都是回調函數:第一個參數resolved,第二個參數rejected,分別對應成功狀態和失敗狀態,使用then方法來獲取返回的結果和狀態。對象

  Promise的then 方法:promise對象中用來執行回調函數的方法,then方法接受兩個參數,第一個是成功的resolved的回調,另外一個是失敗rejected的回調,且第二個失敗的回調參數可選。而且then方法裏也能夠返回promise對象。blog

  (2):promise的狀態只被執行一次

 1 // promise 狀態只能被執行一次
 2 var pms = new Promise(function(resolve,reject){
 3     // 1:在 promise 中 resolve和reject,只能被調用一次,不能同時調用
 4     // 2:當執行resolve或者reject時,這個Promise當中狀態就會被修改
 5     resolve(4) // 只執行第一個,後面的不執行
 6     reject(3)
 7     resolve(2)
 8     reject(1)
 9 })
10 // 調用 promise - then方法
11 // catch 方法:是promise中執行 promise發生錯誤時的方法
12 pms.then(function(num){
13     console.log(num)  // 4
14 }).catch(function(num){
15     console.log(num)
16 })

  使用promise,他的狀態要麼從pending改變成resolve,要麼就是從pending改變成reject,當在promise中調用屢次promise對象的回調,只會執行一次。

  catch 方法是promise中執行 promise發生錯誤時的方法

  (3):promise的resolve和reject方法

 1 // Promise.resolve() 方法:直接執行Promise的resolve方法,而且傳入參數
 2 // 返回一個Promise對象,狀態爲resolve
 3 // pmsRes 的狀態爲 resolve
 4 var pmsRes = Promise.resolve(3).then(function(num){
 5     console.log(num); // 3
 6 })
 7 
 8 // Promise.reject() 方法:直接執行Promise的reject方法,而且傳入參數
 9 // 返回一個Promise對象,狀態爲rejected
10 // pmsRes 的狀態爲 reject
11 var pmsRej = Promise.reject(1).then(function(num){
12     console.log(num); // Uncaught (in promise) 1
13 })

   (4):promise.all()的方法 - all中的參數是一個數組,數組中放置的時promise對象,只有當數組中全部的都執行成resolve狀態,纔會執行all方法,注意,必定是全部,有一個是爲失敗,all方法不會執行,至關於運算符且 &&

 1 function loadImage(src){
 2     var pms = new Promise(function(resolve,reject){
 3         var img = new Image()
 4         // 給 img 添加 load事件 和 error事件,由promies 回調函數返回結果
 5         img.onload = function(){
 6             resolve(img);
 7         } 
 8         img.onerror = function(){
 9             // 當錯誤時,執行reject
10             reject(src);
11         }
12         // 給img 添加地址 - 在這裏爲同步代碼
13         img.src = src;
14     })
15     // 返回這個 promies 對象
16     return pms;
17 }
18 var arr = [];
19 for(var i = 0;i < 5;i++){
20     var res = loadImage('./images/'+i+'.jpg');
21     arr.push(res);
22 }
23 // 當arr數組中全部的都完成了,纔會執行all方法
24 Promise.all(arr).then(function(list){
25     list.forEach(itme=> {
26         // 在這裏只有圖片都完成,纔會打印全部圖片的寬度
27         console.log(itme.width);
28     });
29 })

圖片格式:

  (5): 連綴式寫法,處理回調地獄

 

 1 function loadImage(src){
 2     
 3     var pms = new Promise(function(resolve,reject){
 4         // 建立圖片
 5         var img = new Image()
 6         // 給 img 添加 load事件 和 error事件,由promies 回調函數返回結果
 7         img.onload = function(){
 8             // 當正確時,執行resolve
 9             resolve(img);
10         } 
11         img.onerror = function(){
12             // 當錯誤時,執行reject
13             reject(src);
14         }
15         // 給img 添加地址 - 在這裏爲同步代碼
16         img.src = src;
17     })
18     // 返回這個 promies 對象
19     return pms;
20 }
21 // promies 連綴式寫法:結合loadImage函數
22 // then調用 return 返回下一次的結果
23 loadImage('./img/5-.jpg').then(function(img){
24     console.log(img.width,img.src)
25     return loadImage('./img/6-.jpg');
26 }).then(function(img){
27     console.log(img.width,img.src)
28     return loadImage('./img/7-.jpg');
29 }).then(function(img){
30     console.log(img.width,img.src)
31     return loadImage('./img/8-.jpg');
32 }).then(function(img){
33     console.log(img.width,img.src)
34     return loadImage('./img/9-.jpg');
35 }).then(function(img){
36     console.log(img.width,img.src);
37 })

  如上,經過不斷 return 返回promise對象,那麼圖片的加載就會按照咱們本身的想法順序加載。且比較美觀,當圖片較多,能夠經過循環的方式來返回promise對象,就不須要一直連綴下去了。

相關文章
相關標籤/搜索