成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

實例解析ES6 Promise的原理和使用

1. Promise 之前

1.1 回調函數

回調函數:把函數A當作參數傳遞給另一個函數B調用,那么A就是回調函數?!就扑]:JavaScript視頻教程】

一些例子
具名回調

function 你有幾只狗(fn){     fn('一只狗') }function 數狗(數量){     console.log(數量) } 你有幾只狗(數狗)   // 一只狗

匿名回調

function 你有幾只狗(fn){     fn('一只狗') } 你有幾只狗(function(數量){console.log(數量)  })         //  一只狗

常見的例子
jQuery中使用回調函數,這里用的是匿名回調的方式

$("#btn").click(function(){     console.log('點到我了') })

1.2 回調地獄(回調缺點1)

回調地獄:指的是回調嵌套過多的情況,導致代碼很難被看懂。

let info = []function 你有幾只狗(fn){     fn('一只狗') }function 你有幾只貓(fn){     fn('一只貓') }function 知道了(數量,callback){     info.push(數量)     console.log(info)    if(callback){         callback()     } }// 開始調用 如果比這再多幾層,就不容易看懂了你有幾只狗(function(狗數){     console.log(狗數)     知道了(狗數, function(){         你有幾只貓(function(貓數){             console.log(貓數)             知道了(貓數)         })     }) })

1.3 不使用Promise,如何解決

利用具名函數代替匿名函數

let info = []function 你有幾只狗(fn){     fn('一只狗') }function 你有幾只貓(fn){     fn('一只貓') }function 知道了(數量,callback){     info.push(數量)     console.log(info)    if(callback){         callback()     } }function 告訴你貓的個數(貓數){     console.log(貓數)     知道了(貓數) }function 繼續數(){     你有幾只貓(告訴你貓的個數) }function 告訴你狗的個數(狗數){     console.log(狗數)     知道了(狗數, 繼續數) } 你有幾只狗(告訴你狗的個數)  // 好像也沒好到哪去。。。

1.4 回調方式各不相同,需要單獨記憶(回調缺點2)

readFile('C:\1.txt',function (error, data) {   // node.js 讀取文件方法中的回調         if(error) {             console.log('成功')             console.log(data.toString())         } else {             console.log('讀取文件失敗')         }     })  $.ajax({                              // jQuery中ajax方法中的回調     url:'/2.txt'     success: function(response) {         console.log('成功')     },     error: function(){         console.log('失敗')     } })

2. Promise 的目的

Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。

3. Promise 的原理

3.1 實現原理

ES6 規定,Promise對象是一個構造函數,用來生成Promise實例。通過在函數內部return 一個 Promise對象的實例,這樣就可以使用Promise的屬性和方法進行下一步操作了。

function 函數名(){    return new Promise(function(resolve, reject) {         // ... some code          if (/* 異步操作成功 */){             resolve(value);   // 異步操作成功時調用,把結果作為參數傳遞出去           } else {             reject(error);     // 異步失敗時調用,把錯誤作為參數傳遞出去           }      }) }

3.2 調用邏輯

實例解析ES6 Promise的原理和使用
S1和E1兩個都沒有報錯,執行S2(resolve執行,系統認為搞定了,沒報錯)
S1和E1任何一個有報錯,執行E2(reject執行,系統認為沒搞定,報錯了)

4. Promise 的使用

4.1 Promise 的屬性與方法

屬性
Promise.prototype 表示 Promise 構造器的原型
方法
Promise.prototype.then()
返回一個 Promise 。它最多需要有兩個參數:Promise 的成功和失敗情況的回調函數。
Promise.prototype.catch()
返回一個Promise,并且處理拒絕的情況。等價于Promise.prototype.then(undefined, onRejected)
Promise.prototype.finally()
finally() 方法返回一個Promise,在執行then()和catch()后,都會執行finally指定的回調函數。避免同樣的語句需要在then()和catch()中各寫一次的情況。
Promise.all(iterable)
返回一個 Promise 實例,iterable參數內所有的 promise 都resolved后,才回調完成resolve。
Promise.race(iterable)
返回一個 promise ,并伴隨著 promise對象解決的返回值或拒絕的錯誤原因, 只要 iterable 中有一個 promise 對象”解決(resolve)”或”拒絕(reject)”。
Promise.resolve()
返回一個以給定值解析后的Promise對象。但如果這個值是個thenable(即帶有then方法),返回的promise會“跟隨”這個thenable的對象,采用它的最終狀態(指resolved/rejected/pending/settled);如果傳入的value本身就是promise對象,則該對象作為Promise.resolve方法的返回值返回;否則以該值為成功狀態返回promise對象。
Promise.reject()
返回一個帶有拒絕原因reason參數的Promise對象。

4.2 將回調地獄中的例子,改寫為Promise的形式

實例解析ES6 Promise的原理和使用
可以看到使用 Promise后,邏輯變得非常直觀
寫得更完整一些
實例解析ES6 Promise的原理和使用
Promise套Promise時,也就是Promise鏈的時候——注意信息的傳遞
一個失敗的例子,當我們使用Promise鏈的時候,如果每一步都需要上一步的數據時,就需要傳參,成功通過resolve傳參,失敗通過reject傳參,如果忘記傳參,就得不到想要的結果。
resolve把成功的數據返回給下一個回調
reject把失敗的數據返回給下一個回調。
實例解析ES6 Promise的原理和使用
給這里的resolve傳一個參
實例解析ES6 Promise的原理和使用
改成失敗的例子
先不給reject傳參,如果失敗的話,下一個回調拿不到數據
實例解析ES6 Promise的原理和使用
給 reject傳參
實例解析ES6 Promise的原理和使用
我們可以看到,即使是走的失敗回調,下一個成功回調還是執行了,由于 不知道() 默認返回undefined, 相當于失敗已經處理了,在成功和失敗都被處理的情況下,下一個回調會執行的。
改成符合預期的,即失敗不調用。
實例解析ES6 Promise的原理和使用
失敗不調用的簡寫形式
實例解析ES6 Promise的原理和使用
上述情況執行后 .then(除了狗呢)里面的成功回調沒有執行,我們增加一個失敗回調看看
實例解析ES6 Promise的原理和使用
同樣也可以返回 resolve,讓后面成功回調可以執行
實例解析ES6 Promise的原理和使用

4.3 應用

加載圖片
將圖片的加載寫成一個Promise,一旦加載完成,Promise的狀態就發生變化。

const preloadImage = function (path) {   return new Promise(function (resolve, reject) {     const image = new Image();     image.onload  = resolve;     image.onerror = reject;     image.src = path;   }); };

Generator 函數與 Promise 的結合(詳情見參考鏈接,阮一峰的教程)

5. 干掉Promise中的回調

5.1 await

成功的情況
實例解析ES6 Promise的原理和使用
失敗的情況
利用 try catch
實例解析ES6 Promise的原理和使用
await 配合 try catch使用,比較完整

6. 總結

能利用Promise對象,把普通函數改成返回Promise的形式,解決回調地獄的問題。
明白Promise的成功失敗調用邏輯,可以靈活的進行調整。
理解核心知識,先用起來,慢慢整合吸收知識。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
丰满少妇被粗大猛烈进人高清| 阿姨呀咿呀啊咿呀咿呀| 无码人妻一区二区三区免水牛视频| 国产成 人 在线观看 亚洲| 综合 欧美 亚洲日本| 亚洲VA欧美VA国产VA综合| 少妇寂寞难耐被黑人中出| 欧美最猛黑人XXXⅩ猛男野外| 炕上光着腚压在女人身上| 激情五月色综合国产精品| 国产久热精品无码激情| 丰满人妻一区二区三区免费视频 | 糖心短视频VLOG柚子猫| 人妻无码熟妇乱又伦精品| 男男高H啊灌满了高潮视频| 久久午夜夜伦鲁鲁片无码免费| 精品人妻一区二区三区Av| 国产乱人伦偷精品视频免| 国产AV无码专区亚洲AⅤ蜜芽| 成人网站在线观看丰满少妇电影 | 亚洲色大成网站WWW永久| 亚洲AV无码成人精品区| 午夜DJ免费完整在线看网| 无码超级大爆乳在线播放| 婷婷丁香五月深爱憿情网| 天干天干啦夜天干天天爽| 亚洲国产成人精品无码区在线观看 | 亚洲AV无码国产精品色午夜软件| 午夜人性色福利无码视频在线观看| 哦┅┅快┅┅用力啊熟妇| 久久理伦片琪琪电影院| 精品亚洲国产成人AV在线时间短| 黑人又大又粗又硬XXXXX免费| 国产午夜男女爽爽爽爽爽| 国产精品永久免费| 久久午夜福利无码1000合集| 日韩AV无码一区二区| 色综合亚洲一区二区小说性色AⅤ| 亚洲AV无码国产在丝袜APP | 亚洲AⅤ中文无码字幕色| 午夜无码乱码在线观看| 永久免费观看美女裸体的网站| 在镜子面前看我是怎么爱你的| 伊人激情AV一区二区三区| 成 人 免 费 黄 色| 丰满少妇人妻HD高清大乳在线 | 青青草国产成人99久久| 久久婷婷人人澡人人喊人人爽| 久久久久精品国产亚洲AV| 久久亚洲精品成人无码| 日韩国产女人久久久| 亚洲中国最大AV网站| 在线精品国产成人综合| 国产成人精品免费午夜APP| 久久婷婷色五月综合图区| 少妇久久久久久被弄到高潮| 永久免费无码Av成人性色AV| 51CG9热心的朝阳群众| CHINESEHD国产精品麻豆| 大陆少妇XXXX做受| 国产日产免费高清欧美一区 | 欧美成人V片观看| 日本乱偷人妻中文字幕久久| 色老板在线永久免费视频| 无码中文字幕人妻在线一区二区三| 亚洲AV无码专区国产乱码波多野 | 妹妹中考前让我C了1次| 人妻厨房出轨上司HD院线| 亚洲精品无码GV在线观看| 中文字幕人妻不在线无码视频| JAPAN高清日本乱XXXXX| 丰满性熟妇ⅩXXOOOZZX| 乱人伦中文字幕在线| 日本熟妇人妻XXXXX视频| 香蕉久久久久久久AV网站| HEYZO高清中文字幕在线| 精品人妻少妇嫩草Av无码专区 | 日本一卡二卡四卡无卡国产| 岳故意装睡让我挺进去的电影| 国产裸体裸美女无遮挡网站| 人妻 中文 无码 JAVHD| 一线产区与二线产区的定义| 国产一区二区三区在线观看免费| 久久夜色精品国产嚕嚕亚洲AV | 国内毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 7777色情XXXX欧美| 城中村勾搭老熟女啪啪| 99精品国产兔费观看久久| 丰满年经的继拇6| 蜜臀成人片免费视频在线观看| 亚洲AV极品无码专区亚洲AV| 又黄又无遮挡AAAAA毛片 | 7777成年免费视频| 精品无码AV无码免费专区| 欧美性爱一区二区三区| 无遮挡粉嫩小泬久久久久久欧| 八戒八戒在线高清观看视频4| 国产偷国产偷亚洲清高网站| 老外免费CSGO交易网站下载| 色老板在线永久免费视频| 99国产欧美精品久久久蜜芽| 久久久久影院美女国产主播| 亚洲国产精品成人久久久| 国产麻豆MD传媒视频| 视频无码一区二区| 又大又粗又爽又黄的少妇毛片 | 夫妻互换呻吟抽插小说| 久久久久国色AV免费看| 亚洲AV自慰白浆喷水少妇| 国产精品无码久久久久成人影院| 麻豆精品久久久久久久99蜜桃| 亚洲日韩精品无码AV成人小说| 草草CCYY免费看片线路| 欧美黑人巨大XXXXX| 亚洲GAY片在线GV网站| 国产精品久久婷婷六月丁香| 欧美18VIDEOSEX性欧美| 中文字幕被公侵犯的漂亮人妻| 久久久久精品午夜福利| 亚洲熟女少妇一区二区| 精品无人区麻豆乱码无限制 | 日韩人妻无码一区2区3区| 亚洲综合伊人久久综合| 国产传媒精品1区2区3区| 男朋友要再做一次才同意分手| 一面膜上边一面膜下边53分钟| 国产高潮呻吟无码精品AV| 牲交A欧美牲交AⅤ免费一| 国产99久9在线 | 传媒| 欧美极品少妇XXXXⅩO69| 77色午夜成人影院综合网| 欧美成人午夜免费全部完| AV一本久道久久波多野结衣| 痉挛高潮喷水AV无码免费| 亚洲老熟女 @ TUBEUM| 国产精品99久久久久久宅男小说| 欧美黑人一级爽快片婬片高清| 97色伦综合在线欧美视频| 欧美视频一区二区图文| 把女人弄爽大黄A大片片| 日产2021一二三四免费| 国产 在线 | 日韩| 小少妇BBBBBBBBBBBB| 大量潮喷潮喷极限高H| 他将头埋进双腿间吮小核故事| 国产精品免费AⅤ片在线观看| 小洞饿了想吃大香肠| 好硬啊一进一得太深了A片69| 色欲丰满熟妇人妻av一区二区 | 亚洲另类欧美综合久久图片区| 久久精品高清一区二区三区| 小SAO货边洗澡边CAO你| 黑人大性殖器大战欧美白妇| 亚洲熟妇A∨日韩熟妇在线| 麻豆成人精品国产免费| YY8男人的天堂| 能让我流水水的一千字| 一本大道香蕉久中文在线播放| 黑料不打烊隐藏入口GITHUB| 亚洲色无码中文字幕手机在线| 免费人成视网站在线不卡| 亚洲综合无码久久精品综合 | 综合色天天鬼久久鬼色| 人妻中文无码就熟专区| 国产精品国产三级国产专不| 亚洲欧美韩国综合色| 欧美丰满熟妇XXXX性大屁股 | 熟女作爱一区二区视频| 成人免费无码大片A毛片抽搐 | 久久国产精品99精品国产| 亚洲GV天堂GV无码男同在线观| 久久久无码精品国产一区| AV无码久久久久不卡网站下载| 私人影院无在线码免费| 韩漫画免费网站在线观看| 中文字幕丝袜人妻制服丝袜在线| 日本乱偷人妻中文字幕久久| 国产一区二区三区不卡AV| 在线国内永久免费CRM| 搡BBBB搡BBB搡五十| 加勒比色综合久久久久久久久 | 日韩免费无码人妻波多野| 国产亚洲成AV人片在线观黄桃 | 久久影院午夜理论片无码| 四虎影视在线观看2413| 记忆女神的女儿们| 99久久99精品久久久久久| 久久AⅤ无码AV高潮AV喷吹| 19岁MACBOOKPRO日本| 免费AV大片在线观看入口| 粗大黑人巨茎大战欧美成人 | 国产精品99久久免费观看| 野花香影院在线观看视频免费| 日本AⅤ精品一区二区三区| 爸爸入狱以后妈妈双人桥小权| 小SAO货水好多真紧H无码视频| 免费国产VA在线观看中文字| 国产高清在线观看AV片麻豆| 在线天堂中文最新版WWW| 欧美丰满熟妇乱XXXXX视频|