深入了解JavaScript Promise
一 什么是 Promise?
一個(gè) Promise 對(duì)象就像容器一樣,在容器中寫著一段執(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 可以簡(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()沒有返回值的函數(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 對(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()來實(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-07
js實(shí)現(xiàn)點(diǎn)擊鏈接后窗口縮小并居中的方法
這篇文章主要介紹了js實(shí)現(xiàn)點(diǎn)擊鏈接后窗口縮小并居中的方法,實(shí)例分析了javascript操作窗口的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
解決axios會(huì)發(fā)送兩次請(qǐng)求,有個(gè)OPTIONS請(qǐng)求的問題
這篇文章主要介紹了解決axios會(huì)發(fā)送兩次請(qǐng)求,有個(gè)OPTIONS請(qǐng)求的問題,需要的朋友可以參考下2018-10-10
JavaScript 異步調(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-09
clientX,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

