先看看ES5中異步編程的使用。
1 let ajax = function (callBlack) { 2 setTimeout(function () { 3 callBlack && callBlack() 4 }, 1000); 5 } 6 ajax(function () { 7 console.log(1) 8 });
在ES6中使用Promise來解決異步編程。
1 let ajax = function () { 2 return new Promise(function (reslove, reject) { 3 setTimeout(function () { 4 reslove() 5 }, 1000); 6 }) 7 } 8 ajax().then(function () { 9 console.log(1); 10 })
有多個步驟,讓異步編程更加簡單。
1 let ajax = function () { 2 return new Promise(function (reslove, reject) { 3 setTimeout(function () { 4 reslove() 5 }, 1000); 6 }) 7 } 8 ajax().then(function () { 9 console.log(1); 10 return new Promise(function (reslove, reject) { 11 setTimeout(function () { 12 reslove() 13 }, 2000); 14 }) 15 }).then(function () { 16 console.log(2) 17 });
在Promise中可以使用catch來捕獲異常。
1 let ajax = function (num) { 2 return new Promise(function (reslove, reject) { 3 if (num > 1) { 4 reslove(); 5 return; 6 } 7 throw new Error("錯誤"); 8 }) 9 } 10 ajax(0).then(function () { 11 console.log("正確"); 12 }).catch(function (err) { 13 console.log(err); 14 });
下面是一個案例,目的是當頁面的圖片都加載完才把圖片顯示到頁面中,如果其中有一個出錯了就不顯示。
1 function loading(src) { 2 return new Promise((resolve, reject) => { 3 let img = document.createElement("img"); 4 img.src = src; 5 img.onload = function () { 6 resolve(img); 7 }; 8 img.onerror = function (err) { 9 reject(err) 10 } 11 }) 12 } 13 14 function showimg(imgs) { 15 imgs.forEach(function (img) { 16 document.body.appendChild(img); 17 }); 18 } 19 Promise.all([ 20 loading("./img/banner01.jpg"), 21 loading("./img/banner02.jpg") 22 ]).then(showimg);
下面這個例子是當圖片先加載的先顯示出來,沒加載的就不再顯示了。
1 function loading(src) { 2 return new Promise((resolve, reject) => { 3 let img = document.createElement("img"); 4 img.src = src; 5 img.onload = function () { 6 resolve(img); 7 }; 8 img.onerror = function (err) { 9 reject(err) 10 } 11 }) 12 } 13 14 function showimg(imgs) { 15 let p = document.createElement("p"); 16 p.appendChild(imgs) 17 document.body.appendChild(p); 18 } 19 Promise.race([ 20 loading("./img/banner01.jpg"), 21 loading("./img/banner02.jpg") 22 ]).then(showimg);