Promise異步執行


由於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仍在繼續運行,


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM