深入了解JavaScript Promise
一 什么是 Promise?
一個(gè) Promise 對象就像容器一樣,在容器中寫著一段執(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è)問題:
- Callback hell
Callback hell:Promise 可以把一層層嵌套的 callback 變成 .then().then()…,從而使代碼編寫和閱讀更直觀
- 錯(cuò)誤處理難:Promise 比 callback 在錯(cuò)誤處理上更清晰直觀
- 同時(shí)進(jìn)行多個(gè)異步操作的代碼編寫困難:Promise 可以簡單處理此情況
三 Promise常用api
- .then() promise中方法執(zhí)行完以后,可以執(zhí)行,里面有兩個(gè)參數(shù),分別是成功的回調(diào)函數(shù)和失敗的回調(diào)函數(shù)。
- resolve 使用 promise.resolve 方法可以快速的返回一個(gè)promise對象
- reject 使用 promise.reject 方法可以快速的返回一個(gè)promise對象
- all 同時(shí)執(zhí)行多個(gè)并行異步操作。
四 Promise常用的兩個(gè)用法
1 如何解決 callback hell?
.then()沒有返回值的函數(shù),會(huì)使得 Promise 鏈不再延續(xù),此時(shí)你再往后面調(diào)用 .then() 是沒有作用的。
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 對象的函數(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)用場景描述(你需要同時(shí)調(diào)多個(gè)接口的數(shù)據(jù),并在前端對數(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()來實(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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
js中自定義方法實(shí)現(xiàn)停留幾秒sleep
js中不存在自帶的sleep方法,要想休眠要自己定義個(gè)方法,需要的朋友可以參考下2014-07-07js實(shí)現(xiàn)點(diǎn)擊鏈接后窗口縮小并居中的方法
這篇文章主要介紹了js實(shí)現(xiàn)點(diǎn)擊鏈接后窗口縮小并居中的方法,實(shí)例分析了javascript操作窗口的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03解決axios會(huì)發(fā)送兩次請求,有個(gè)OPTIONS請求的問題
這篇文章主要介紹了解決axios會(huì)發(fā)送兩次請求,有個(gè)OPTIONS請求的問題,需要的朋友可以參考下2018-10-10JavaScript 異步調(diào)用框架 (Part 2 - 用例設(shè)計(jì))
在上一篇文章里說到,我們要設(shè)計(jì)一個(gè)異步調(diào)用框架,最好能夠統(tǒng)一同步異步調(diào)用的接口,同時(shí)具體調(diào)用順序與實(shí)現(xiàn)方式無關(guān)。那么我們現(xiàn)在就來設(shè)計(jì)這樣一個(gè)框架的用例。2009-08-08用console.table()調(diào)試javascript
昨天我了解到Chrome調(diào)試工具一個(gè)小巧的調(diào)試方法,在WDCC期間, Marcus Ross(@zahlenhelfer) 介紹了,chrome調(diào)試工具各種調(diào)試方法,這個(gè)只是其中一種,現(xiàn)在我來給大家秀下。2014-09-09clientX,pageX,offsetX,x,layerX,screenX,offsetLeft區(qū)別分析
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft區(qū)別分析,需要的朋友可以參考下。2010-03-03基于openlayers4實(shí)現(xiàn)點(diǎn)的擴(kuò)散效果
這篇文章主要為大家詳細(xì)介紹了基于openlayers4實(shí)現(xiàn)點(diǎn)的擴(kuò)散效果 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01