中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Promise實例代碼分析

發布時間:2023-03-02 09:42:05 來源:億速云 閱讀:108 作者:iii 欄目:web開發

這篇文章主要介紹“Promise實例代碼分析”,在日常操作中,相信很多人在Promise實例代碼分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Promise實例代碼分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

先來看一個問題

我們都知道 JavaScript 是單線程運行的,所以如果遇到一個數據需要過段時間才能獲取到的情況,就會形成阻塞導致后面的代碼也無法執行,而這相當致命,比如下面代碼

function sum(a, b) {
    const begin = Date.now();
    while(Date.now() - begin < 10000) {

    }
    return a+b;
}

console.log(sum(1,2));
console.log("1");

中間的 while 語句經歷了10秒的循環,最終才分別打印出了 3 和 1

然而我們希望的是允許3在10秒后再打印出來,但是1得先打印出來

這里我們就用到了setTimeout,修改代碼如下

function sum(a, b) {
    setTimeout(() => {
        return a+b;
    },10000)
}

console.log(sum(1,2));
console.log("1");

運行一下可以看到1確實瞬間被打印出來了,但是本該打印3的位置是undefined

Promise實例代碼分析

原因在于此時的console.log同樣沒有等待setTimeout走完,無法接收到10秒后的數據

所以為了能夠接收到這個10秒后的數據,我們可以采用回調函數的方式

function sum(a, b, callback) {

    setTimeout(() =>{
        callback(a+b);
    }, 10000)

}

sum(1,2,(result) => {
    console.log(result);
});
console.log("1");

傳入了一個能夠接收 a+b 為參數的回調函數 (result) => {console.log(result);}

所以在10秒后會執行這個回調函數,進行打印,結果如下

Promise實例代碼分析

這樣我們就初步解決了這個問題,一個需要延時獲取的數據在其他代碼先執行后再被獲取。

然而 Promise 還沒出現,這就涉及了另一個需要改進的地方

回調地獄

這是個乍一聽很唬人的稱呼,實際上就是多層回調函數的嵌套導致的不利于閱讀和調試的情況。

比如此時我們想要多次調用這個sum函數,要在得到1+2的結果后,再獲得 1+2+3,1+2+3+4 這些結果

所以我們得在sum傳入的回調函數里再多次調用sum進行嵌套,如下

sum(1,2,(result) => {
    sum(result, 3, (result) => {
        sum(result, 4, (result) => {
            console.log(result);
        })
    })
});

Promise實例代碼分析

這種類似金字塔的結構可讀性差且不好調試,被稱作回調地獄。

所以此時終于到了Promise出場的時候,它的出現解決了回調地獄的問題。

Promise 是什么

在使用Promise解決回調地獄的問題前,先來大致地了解一下什么是Promise。

目前我對它的判斷是,Promise 是一個用于存取異步數據的對象。

首先來看一下空的 Promise 打印出來會是什么

const promise = new Promise(()=>{});

Promise實例代碼分析

其中最關鍵的就是 PromiseState 和 PromiseResult 兩個值,之后會詳細展開,這里只要知道Promise中有著這兩個屬性即可。

接著來看一下 promise 存數據的過程,最關鍵的就是要知道有 resolve 和 reject,比如下面代碼

const promise = new Promise((resolve, reject) => {
    const flag = true;
    if (flag) {
        resolve("resolve datas");
    } else {
        reject("reject data");
    }
})

此時flag為true,所以執行的是resolve的存儲,得到的結果如下

Promise實例代碼分析

而當我們把flag改為false,執行reject的存儲時,得到的結果如下

Promise實例代碼分析

現在是解釋上面兩個屬性的時候了,

  • 當 promise 沒有存儲數據時,PromiseState 的值為 pending,PromiseResult的值為 undefined

  • 當 promise 使用 resolve 存儲數據時,PromiseState 的值為 pending,PromiseResult的值為 相應存儲值

  • 當 promise 使用 reject 存儲數據時,PromiseState 的值為 rejected,PromiseResult的值為相應存儲值

既然存有兩種類型,讀自然也要分兩種

當我們讀取promise中的數據時,我們需要使用如下的結構

promise.then(result => {
    console.log(result);
}, reason => {
    console.log(reason);
})

如果數據存在resolve中,result會返回結果,如果存在reject中,reason會返回結果。

使用Promise解決回調地獄

在初步了解了Promise后,會發現目前Promise能做的事,使用回調函數也能完成。

所以最主要的還是Promise解決了回調地獄,比如之前的問題,可以寫成這種形式

function sum(a, b) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(a+b);
        }, 1000);
    })
}

sum(1,2)
    .then(result => sum(result,3))
    .then(result => sum(result,4))
    .then(result => {
        console.log(result);
    })

promise 通過then方法進行讀取后,是個新的Promise對象,比如我們可以打印一下

function sum(a, b) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(a+b);
        }, 1000);
    })
}

console.log(sum(1,2)
    .then(result => sum(result,3)))

Promise實例代碼分析

所以這也就給了我們能多次調用then方法的基礎。

而這也就解決了回調地獄的問題。

到此,關于“Promise實例代碼分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙游县| 和平县| 库车县| 砚山县| 运城市| 永安市| 江陵县| 新安县| 成安县| 娄底市| 宁化县| 万山特区| 鹤岗市| 兴安县| 吴江市| 庄浪县| 那坡县| 瑞丽市| 湖州市| 伊吾县| 庄河市| 陆河县| 潼关县| 泽州县| 昌黎县| 东海县| 安义县| 文登市| 宜丰县| 高安市| 崇仁县| 永清县| 安庆市| 西藏| 同仁县| 达州市| 南漳县| 郎溪县| 巴林右旗| 汉川市| 沽源县|