由於js代碼都是單線程執行的導致所有的網絡操作、瀏覽器時間,都必須是異步執行,以前的話異步執行可以用回調函數實現 callback,隨着promise的誕生,對異步處理有了更好的實現方式,promise的用法如下:
function getImage(src){ return new Promise(function(res,rej){ let Img=new Image(); Img.onload=function(){ res(img) } Img.onerror=function(){ rej('圖片加載失敗') } img.src=src; }) getImage('a.jpg').then(function(img){ console.log(img) },function(error){ console.log(error); } })
除了串行執行若干異步任務外,Promise還可以並行執行異步任務。
試想一個頁面聊天系統,我們需要從兩個不同的URL分別獲得用戶的個人信息和好友列表,這兩個任務是可以並行執行的,用Promise.all()
實現如下:
var p1 = new Promise(function (resolve, reject) { setTimeout(resolve, 500, 'P1'); }); var p2 = new Promise(function (resolve, reject) { setTimeout(resolve, 600, 'P2'); }); // 同時執行p1和p2,並在它們都完成后執行then: Promise.all([p1, p2]).then(function (results) { console.log(results); // 獲得一個Array: ['P1', 'P2'] });
有些時候,多個異步任務是為了容錯。比如,同時向兩個URL讀取用戶的個人信息,只需要獲得先返回的結果即可。這種情況下,用Promise.race()
實現
var p1 = new Promise(function (resolve, reject) { setTimeout(resolve, 500, 'P1'); }); var p2 = new Promise(function (resolve, reject) { setTimeout(resolve, 600, 'P2'); }); Promise.race([p1, p2]).then(function (result) { console.log(result); // 'P1' });
由於p1執行較快,promise的then()將獲得結果'p1',p2仍在繼續運行,