Promise編程
基本概念:
Promise:是ES6中新增的異步編程解決方案,體如今代碼中它是一個對象,能夠經過Promise 構造函數來實例化。數組
new Promise(cb)
三種狀態:Pending、 Resolved、Rejectedapp
兩個原型方法:
Promise.prototype.then()
Promise.prototype.catch()異步
兩個經常使用的靜態方法:
Promise.all() // 能夠將多個Promise實例包裝成一個新的Promise實例異步編程
Promise.resolve()函數
Pending ====> Resolved(已完成)
Pending ====> Rejected(已失敗)this
console.log(1) const p = new Promise(function(resolve, reject){ const img = new Image(); img.src = ''; img.onload = function(){ resolve(this); } img.onerror = function(){ reject(new Error('圖片加載失敗')); } }) p.then(function(img){ document.body.appendChild(img); }, function(err){ console.log(err) }) //第一個參數是執行成功的,第二個函數是執行失敗(通常不推薦第二個參數,採用catch) console.log(2) p.catch(function(err){ console.log(err) }) // 1 2 error(異步,不影響後面加載) var imgs = ['a.jpg', 'b.jpg', 'c.jpg'] function loadImg(url){ const p = new Promise(function(resolve, reject){ const img = new Image(); img.src = ''; img.onload = function(){ resolve(this); } img.onerror = function(){ reject(new Error('圖片加載失敗')); } }) return p; } const allDone = Promise.all([loadImg(imgs[0])], [loadImg(imgs[1])], [loadImg(imgs[2])]); allDone.then(function(data){ console.log(data) // data 就是一組數組 }).catch(function(err){ console.log(err) // })
Promise.resolve()三種用法
//參數是Promise實例,將不作任何修改、原封不動的返回這個實例url
Promise.resolve(loadImg(imgs[0]).then(function(data){ console.log(data) // })
//將對象轉爲Promise對象,而後就當即執行thenable對象的then方法prototype
Promise.resolve({ then(resolve, reject){ const img = new Image(); img.src = imgs[0]; img.onload = function (){ resolve(this) } } }).then(function(data){ })
//參數是一個基本數據類型或者不傳參數 ,那麼返回一個狀態爲resolved的Promise對象code
Promise.resolve('abc').then(function(str){ console.log(str); //abc }) const p = Promise.resolve(); console.log(p)