您好,登錄后才能下訂單哦!
這篇文章主要介紹“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
原因在于此時的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 還沒出現,這就涉及了另一個需要改進的地方
這是個乍一聽很唬人的稱呼,實際上就是多層回調函數的嵌套導致的不利于閱讀和調試的情況。
比如此時我們想要多次調用這個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 打印出來會是什么
const promise = new 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的存儲,得到的結果如下
而當我們把flag改為false,執行reject的存儲時,得到的結果如下
現在是解釋上面兩個屬性的時候了,
當 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解決了回調地獄,比如之前的問題,可以寫成這種形式
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)))
所以這也就給了我們能多次調用then方法的基礎。
而這也就解決了回調地獄的問題。
到此,關于“Promise實例代碼分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。