深入了解JavaScript Promise
一 什么是 Promise?
一個(gè) Promise 對(duì)象就像容器一樣,在容器中寫(xiě)著一段執(zhí)行具體操作的代碼,并且在這段代碼執(zhí)行結(jié)束后,會(huì)執(zhí)行兩個(gè)回調(diào)函數(shù),一個(gè)是操作成功的回調(diào)函數(shù)(resolve),一個(gè)是操作失敗的回調(diào)函數(shù)(reject)
二 為什么有 Promise?
Promise 的出現(xiàn)是為了解決異步編程中,主要使用的回調(diào)機(jī)制的幾個(gè)問(wèn)題:
- Callback hell
Callback hell:Promise 可以把一層層嵌套的 callback 變成 .then().then()…,從而使代碼編寫(xiě)和閱讀更直觀(guān)
- 錯(cuò)誤處理難:Promise 比 callback 在錯(cuò)誤處理上更清晰直觀(guān)
- 同時(shí)進(jìn)行多個(gè)異步操作的代碼編寫(xiě)困難:Promise 可以簡(jiǎn)單處理此情況
三 Promise常用api
- .then() promise中方法執(zhí)行完以后,可以執(zhí)行,里面有兩個(gè)參數(shù),分別是成功的回調(diào)函數(shù)和失敗的回調(diào)函數(shù)。
- resolve 使用 promise.resolve 方法可以快速的返回一個(gè)promise對(duì)象
- reject 使用 promise.reject 方法可以快速的返回一個(gè)promise對(duì)象
- all 同時(shí)執(zhí)行多個(gè)并行異步操作。
四 Promise常用的兩個(gè)用法
1 如何解決 callback hell?
.then()沒(méi)有返回值的函數(shù),會(huì)使得 Promise 鏈不再延續(xù),此時(shí)你再往后面調(diào)用 .then() 是沒(méi)有作用的。
Promise.resolve('foo').then(function(s) {
console.log(s);
}).then(function(s) {
// Never executed
console.log(s);
});
.then()中有返回值函數(shù),會(huì)使 Promise 鏈可以繼續(xù)
Promise.resolve('foo').then(function(s) {
console.log(s);
return s + 'bar';
}).then(function(s) {
console.log(s);
});
// foo
// foobar
.then()有返回值且返回值為另一個(gè) Promise 對(duì)象的函數(shù),也會(huì)使 Promise 繼續(xù)·。與前者的區(qū)別在于,再次調(diào)用.then()時(shí)可能會(huì)觸發(fā)的是異步操作,因此不是馬上觸發(fā)下一輪resolve()
Promise.resolve('foo').then(function(s) {
return new Promise((resolve, reject) => {
console.log(s);
setTimeout(() => {
resolve(s + 'bar')
}, 1000);
});
}).then(function(s) {
console.log(s);
});
// foo
// foobar (在 "foo" 顯示了 1s 后顯示)
2 Promise.all() 實(shí)現(xiàn)并發(fā)同步接收返回值
應(yīng)用場(chǎng)景描述(你需要同時(shí)調(diào)多個(gè)接口的數(shù)據(jù),并在前端對(duì)數(shù)據(jù)進(jìn)行處理,這就需要等待所有接口返回?cái)?shù)據(jù)后才能操作。)
// demo
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
Promise.all() 與 sync await區(qū)別
//sync await 操作時(shí)間2秒
async function Index2() {
console.time()
const p1 =await new Promise((resolve, reject) => {
console.log('這里是p1')
setTimeout(() => {
resolve('這里是p1的返回')
}, 1000)
})
const p2 =await new Promise((resolve, reject) => {
console.log('這里是p2')
setTimeout(() => {
resolve('這里是p2的返回')
}, 1000)
})
console.log(p1)
console.log(p2)
console.timeEnd()
}
Index2();

// 使用Promise.all()來(lái)實(shí)現(xiàn)調(diào)用。操作時(shí)間1秒
function Index() {
console.time()
const p1 = new Promise((resolve, reject) => {
console.log('這里是p1')
setTimeout(() => {
resolve('這里是p1的返回')
}, 1000)
})
const p2 = new Promise((resolve, reject) => {
console.log('這里是p2')
setTimeout(() => {
resolve('這里是p2的返回')
}, 1000)
})
Promise.all([p1, p2]).then((val) => {
console.log(val)
console.timeEnd()
})
}

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JS promise解決異步問(wèn)題過(guò)程詳解
Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。簡(jiǎn)單說(shuō)就是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果。從語(yǔ)法上說(shuō),Promise是一個(gè)對(duì)象,從它可以獲取異步操作的消息2023-04-04
兩個(gè)函數(shù)相互調(diào)用如何防止死循環(huán)
這篇文章主要介紹了兩個(gè)函數(shù)相互調(diào)用如何防止死循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
JavaScript防抖與節(jié)流超詳細(xì)全面講解
在開(kāi)發(fā)中我們經(jīng)常會(huì)遇到一些高頻操作,比如:鼠標(biāo)移動(dòng),滑動(dòng)窗口,鍵盤(pán)輸入等等,節(jié)流和防抖就是對(duì)此類(lèi)事件進(jìn)行優(yōu)化,降低觸發(fā)的頻率,以達(dá)到提高性能的目的。本文就教大家如何實(shí)現(xiàn)一個(gè)讓面試官拍大腿的防抖節(jié)流函數(shù),需要的可以參考一下2022-10-10
JavaScript iframe 實(shí)現(xiàn)多窗口通信實(shí)例詳解
這篇文章主要為大家介紹了JavaScript iframe 實(shí)現(xiàn)多窗口通信實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
IE6/7 and IE8/9/10(IE7模式)依次隱藏具有absolute或relative的父元素和子元素后再顯示
多數(shù)情況下隱藏(設(shè)置display:none)一個(gè)元素,無(wú)需依次將其內(nèi)的所有子元素都隱藏。非要這么做,有時(shí)會(huì)碰到意想不到的bug。2011-07-07
JavaScript之instanceof方法手寫(xiě)示例詳解
這篇文章主要為大家介紹了JavaScript之instanceof方法手寫(xiě)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
JavaScript canvas實(shí)現(xiàn)流星特效
這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)流星特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
微信小程序?qū)崿F(xiàn)數(shù)字滾動(dòng)動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)數(shù)字滾動(dòng)動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07

