ES6--promise基本使用

weixin_45846980發表於2020-12-01

什麼是promise

Promise 是非同步程式設計的一種解決方案:從語法上講,promise是一個物件,從它可以獲取非同步操作的訊息;從本意上講,它是承諾,承諾它過一段時間會給你一個結果。promise有三種狀態: pending(等待態),fulfiled(成功態),rejected(失敗態);狀態一旦改變,就不會再變。創造promise例項後,它會立即執行。

promise有什麼作用

一般來說我們會碰到的回撥巢狀都不會很多,一般就一到兩級,但是某些情況下,回撥巢狀很多時,程式碼就會非常繁瑣,會給我們的程式設計帶來很多的麻煩,這種情況俗稱——回撥地獄。

promise是用來解決兩個問題的:

  • 回撥地獄,程式碼難以維護, 常常第一個的函式的輸出是第二個函式的輸入這種現象
  • promise可以支援多個併發的請求,獲取併發請求中的資料
  • 這個promise可以解決非同步的問題,本身不能說promise是非同步的

promise用法

Promise是一個建構函式,自己身上有all、reject、resolve這幾個眼熟的方法,原型上有then、catch等同樣很眼熟的方法。

建立一個promise

let p = new Promise((resolve, reject) => {
    //做一些非同步操作
    setTimeout(() => {
        console.log('執行完成');
        resolve('我是成功!!');
    }, 2000);
});

then 鏈式操作的用法
reject的用法 :
所以,從表面上看,Promise只是能夠簡化層層回撥的寫法,而實質上,Promise的精髓是“狀態”,用維護狀態、傳遞狀態的方式來使得回撥函式能夠及時呼叫,它比傳遞callback函式要簡單、靈活的多。所以使用Promise的正確場景是這樣的:

p.then((data) => {
    console.log(data);
})
.then((data) => {
    console.log(data);
})
.then((data) => {
    console.log(data);
});

catch的用法
把Promise的狀態置為rejected,這樣我們在then中就能捕捉到,然後執行“失敗”情況的回撥。看下面的程式碼。

    let p = new Promise((resolve, reject) => {
        //做一些非同步操作
      setTimeout(function(){
            var num = Math.ceil(Math.random()*10); //生成1-10的隨機數
            if(num<=5){
                resolve(num);
            }
            else{
                reject('數字太大了');
            }
      }, 2000);
    });
    p.then((data) => {
            console.log('resolved',data);
        },(err) => {
            console.log('rejected',err);
        }
    );