關于promise和async用法以及區(qū)別詳解
一、promise promise的概念
Promise 是異步編程的一種解決方案,是一個構造函數(shù),自身有all、reject、resolve方法,原型上有then、catch等方法。
特點:
- 對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失敗)
- 一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。
一句話總結:就是用來解決地域回調(diào)問題(地域回調(diào)--回調(diào)函數(shù)里面嵌套回調(diào)函數(shù))
promise使用方法
用法一:Promise構造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject。它們是兩個函數(shù),由JavaScript引擎提供。
resolve函數(shù)的作用是,將Promise對象的狀態(tài)從“未完成”變?yōu)?ldquo;成功”(即從Pending變?yōu)镽esolved),在異步操作成功時調(diào)用,并將異步操作的結果作為參數(shù)傳遞出去。
reject函數(shù)的作用是,將Promise對象的狀態(tài)從“未完成”變?yōu)?ldquo;失敗”(即從Pending變?yōu)镽ejected),在異步操作失敗時調(diào)用,并將異步操作報出的錯誤作為參數(shù)傳遞出去。
用法二:Promise.resolve() 和 Promise.reject() 可以直接被調(diào)用。有時候,當判斷出 promise 并不需要真正執(zhí)行時,我們并不需要 使用 new 創(chuàng)建 Promise 對象,而是可以直接調(diào)用 Promise.resolve() 和 Promise.reject()。
地獄回調(diào)的例子
回調(diào)地獄是為了讓我們代碼執(zhí)行順序的一種操作(解決異步),但是它會使我們的可讀性非常差。
//地獄回調(diào) setTimeout(function () { //第一層 console.log('小鎖'); //等3秒打印張三在執(zhí)行下一個回調(diào)函數(shù) setTimeout(function () { //第二層 console.log('李四'); //等2秒打印李四在執(zhí)行下一個回調(diào)函數(shù) setTimeout(function () { //第三層 console.log('王五'); //等一秒打印王五 }, 1000) }, 2000) }, 3000)
promise解決地域回調(diào)
function resolveCallback(name, flag = true) { return new Promise((resolve, reject) => { // 處理異步任務 setTimeout(() => { if (flag) { resolve(name) } else { reject('失敗') } }, 1000) }, ) } resolveCallback('張三').then(res => { console.log(res) return resolveCallback('李四') }).then(res => { console.log(res) return resolveCallback('王五') }).then(res => { console.log(res) }).catch(res => { //捕捉失敗的回調(diào)結果 console.log(res) })
Promise.all()方法
Promise.all([ .. ]) 接受一個或多個值的數(shù)組(比如,立即值、promise、thenable)。它返回一個promise。
如果所有的值都完成,這個promise 的結果是完成;
一旦它們中的某一個被拒絕,那么這個promise 就立即被拒絕。
let p1 = resolveCallback('張三') let p2 = resolveCallback('李四') let p3 = resolveCallback('王五') let p = Promise.all([p1,p2,p3]).then(res=>{ console.log(res) }).catch(res=>{ console.log('失敗') })
Promise.race 方法
Promise.race() 函數(shù)返回一個 Promise,它將與第一個傳遞的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失?。╮ejects),這要取決于第一個完成的方式是兩個中的哪個。
let p1 = resolveCallback('張三', 2) let p2 = resolveCallback('李四', 3) let p3 = resolveCallback('王五', 1) let p = Promise.race([p1, p2, p3]).then(res => { console.log(res) }).catch(res => { console.log('失敗') })
二、async async的概念
Async/Await 代碼看起來簡潔一些,使得異步代碼看起來像同步代碼
async函數(shù)一定會返回一個promise對象。如果一個async函數(shù)的返回值看起來不是promise,那么它將會被隱式地包裝在一個promise中。
sync await是基于Promise實現(xiàn)的,可以說是改良版的Promise,它不能用于普通的回調(diào)函數(shù)。
async 函數(shù)中 return 值如何接收?
方式一:通過 promise.then形參獲取
方式二:接受函數(shù)返回值的方式是 await
await的作用
await關鍵字的作用 就是獲取 Promise中返回的內(nèi)容, 獲取的是Promise函數(shù)中resolve或者reject的值(await 作用是獲取promise.[[promiseValue]]的值)
關于await的注意點
(1)await 必須寫在 async 中
(2)await 后是一個promise實例對象
三、為什么async/await更好?
- 使用async函數(shù)可以讓代碼簡潔很多
- 不需要像Promise一樣需要then
- 不需要寫匿名函數(shù)處理Promise的resolve的值
- 也不需要定義多余的data變量,還避免了嵌套代碼
總結
到此這篇關于關于promise和async用法以及區(qū)別的文章就介紹到這了,更多相關promise和async用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
js實現(xiàn)將選中內(nèi)容分享到新浪或騰訊微博
這篇文章主要介紹了js實現(xiàn)將選中內(nèi)容分享到新浪或騰訊微博,需要的朋友可以參考下2015-12-12詳解extract-text-webpack-plugin 的使用及安裝
這篇文章主要介紹了詳解extract-text-webpack-plugin 的使用及安裝,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06基于JavaScript實現(xiàn)回到頁面頂部動畫代碼
這篇文章主要介紹了基于JavaScript實現(xiàn)回到頁面頂部動畫代碼的相關資料,代碼簡單易用,非常實用,需要的朋友可以參考下2016-05-05JS中利用swiper實現(xiàn)3d翻轉(zhuǎn)幻燈片實例代碼
大家都知道Swiper(Swiper master)是目前應用較廣泛的移動端網(wǎng)頁觸摸內(nèi)容滑動js插件。下面這篇文章主要給大家介紹了在JS中利用swiper實現(xiàn)3d翻轉(zhuǎn)幻燈片的相關資料,文中給出了完整的示例代碼供大家參考學習,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08layui 表格操作列按鈕動態(tài)顯示的實現(xiàn)方法
今天小編就為大家分享一篇layui 表格操作列按鈕動態(tài)顯示的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09