gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

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

1. Promise 之前

1.1 回調(diào)函數(shù)

回調(diào)函數(shù):把函數(shù)A當(dāng)作參數(shù)傳遞給另一個函數(shù)B調(diào)用,那么A就是回調(diào)函數(shù)。【推薦:JavaScript視頻教程】

一些例子
具名回調(diào)

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

匿名回調(diào)

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

常見的例子
jQuery中使用回調(diào)函數(shù),這里用的是匿名回調(diào)的方式

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

1.2 回調(diào)地獄(回調(diào)缺點1)

回調(diào)地獄:指的是回調(diào)嵌套過多的情況,導(dǎo)致代碼很難被看懂。

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

1.3 不使用Promise,如何解決

利用具名函數(shù)代替匿名函數(shù)

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

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

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

2. Promise 的目的

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

3. Promise 的原理

3.1 實現(xiàn)原理

ES6 規(guī)定,Promise對象是一個構(gòu)造函數(shù),用來生成Promise實例。通過在函數(shù)內(nèi)部return 一個 Promise對象的實例,這樣就可以使用Promise的屬性和方法進行下一步操作了。

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

3.2 調(diào)用邏輯

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

4. Promise 的使用

4.1 Promise 的屬性與方法

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

4.2 將回調(diào)地獄中的例子,改寫為Promise的形式

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

4.3 應(yīng)用

加載圖片
將圖片的加載寫成一個Promise,一旦加載完成,Promise的狀態(tài)就發(fā)生變化。

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

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

5. 干掉Promise中的回調(diào)

5.1 await

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

6. 總結(jié)

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
两性午夜免费视频| 国产无色aaa| 五月婷婷深爱五月| 美女黄色免费看| 超碰97免费观看| 成人一区二区免费视频| 手机在线看福利| 97公开免费视频| 国产女大学生av| 日本中文字幕网址| 欧美一级片中文字幕| 成人性生交视频免费观看| 国产九色porny| 青青在线视频免费观看| 免费黄色特级片| 国产极品在线视频| 精品无码av无码免费专区| www.成人黄色| 日b视频免费观看| av免费观看国产| 99re在线视频免费观看| 国产一区亚洲二区三区| 久久久久免费精品| 国产精品中文久久久久久| 国产乱淫av片杨贵妃| www.日日操| 日本xxxxx18| 三上悠亚av一区二区三区| 亚洲国产精品影视| 黄色一级片在线看| 国产乱子伦精品视频| 91激情视频在线| 天堂а√在线中文在线| 中文字幕免费高| 国产最新免费视频| 欧美黑人在线观看| 青青草视频在线免费播放| 亚洲精品在线网址| 天堂中文视频在线| 精品免费国产一区二区| 黄色一级视频播放| 亚洲天堂网站在线| 手机免费av片| 日韩第一页在线观看| 中文字幕第一页亚洲| 精品国产鲁一鲁一区二区三区| 国产免费又粗又猛又爽| 国产黄色一级网站| 国产精品av免费观看| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 无码人妻少妇伦在线电影| 天天影视色综合| 奇米视频888| 国产女大学生av| av电影一区二区三区| 亚洲天堂一区二区在线观看| 熟妇熟女乱妇乱女网站| 久久久福利影院| 国产 日韩 亚洲 欧美| 激情内射人妻1区2区3区| 国产尤物av一区二区三区| 欧美三级一级片| 91在线第一页| 亚洲av综合色区| 人人干人人干人人| 精品亚洲一区二区三区四区| 黑森林福利视频导航| 性欧美18一19内谢| 久久久999免费视频| 成人在线免费在线观看| 日韩精品一区中文字幕| 色哺乳xxxxhd奶水米仓惠香| 欧美精品aaaa| 黄色片网址在线观看| 亚洲 欧洲 日韩| 日韩国产一级片| 亚洲免费黄色网| 国产人妻777人伦精品hd| 成人一级片网站| 少妇av一区二区三区无码| 一级性生活视频| 欧美一级免费播放| 日本免费黄视频| 青青草国产免费| 北条麻妃在线视频| 在线观看免费成人av| 极品美女扒开粉嫩小泬| 在线观看国产中文字幕| 成人小视频在线看| 国产人妻互换一区二区| 欧美一级爱爱视频| 老熟妇仑乱视频一区二区 | 日韩中文字幕在线不卡| 高清无码视频直接看| 男人添女人下面高潮视频| 中文字幕超清在线免费观看| 在线视频观看一区二区| 一本色道久久88亚洲精品综合| 国产视频九色蝌蚪| 青青草久久伊人| 免费毛片网站在线观看| 亚洲一区精品视频在线观看| 国产av人人夜夜澡人人爽麻豆| 亚洲这里只有精品| 日本国产一级片| 日本在线xxx| 中文字幕一区二区三区四区在线视频| 啊啊啊一区二区| 国产av无码专区亚洲精品| 加勒比av中文字幕| 能在线观看的av| 色姑娘综合天天| 在线观看免费黄色片| 97人人模人人爽人人澡| 激情六月丁香婷婷| 无码人妻丰满熟妇区毛片| www亚洲成人| 欧美日韩激情视频在线观看| 免费看黄在线看| 韩国视频一区二区三区| 久热精品在线播放| 看一级黄色录像| 大肉大捧一进一出好爽视频| 26uuu成人| 久久久久久久久影视| www.爱色av.com| 青春草国产视频| mm131亚洲精品| 97人人爽人人| 精品国产av无码一区二区三区| 永久免费看av| 亚洲免费av一区| 亚洲高潮无码久久| 亚洲天堂网2018| 欧洲av无码放荡人妇网站| 手机福利在线视频| 欧美精品性生活| www.四虎成人| 日韩av播放器| 久久九九国产视频| 成人在线观看你懂的| www精品久久| 亚洲精品乱码久久久久久动漫| 久久久久久久久久久久91| 午夜免费福利网站| 最新国产黄色网址| 国产精品一二三在线观看| 国产成人亚洲综合无码| 黄色在线视频网| 午夜啪啪小视频| 成熟丰满熟妇高潮xxxxx视频| 日本中文字幕亚洲| 日韩中文字幕亚洲精品欧美| 亚洲娇小娇小娇小| 中文字幕线观看| 亚洲熟妇av日韩熟妇在线| 久久久久国产精品熟女影院 | 日韩中文字幕组| 波多野结衣天堂| 午夜啪啪免费视频| 国产一二三区在线播放| 99精品在线免费视频| 日本中文字幕亚洲| 能看的毛片网站| 国产午夜大地久久| 天天天干夜夜夜操| 一女二男3p波多野结衣| 国产免费999| 久久精品视频在线观看免费| 欧美变态另类刺激| 国产淫片免费看| 精品www久久久久奶水| 日本在线视频www| 日韩成人精品视频在线观看| 男操女免费网站| 99999精品| 国产又粗又大又爽的视频| 午夜剧场在线免费观看| jizzzz日本| 国产毛片久久久久久国产毛片| 97视频久久久| www.精品在线| 婷婷中文字幕在线观看| 国产xxxx振车| 激情综合网俺也去| mm131亚洲精品| 欧美一级视频免费看| 青青草原av在线播放| 成人免费黄色av| 91精品国产91久久久久麻豆 主演| 久久男人资源站| 在线观看的毛片| 女人扒开屁股爽桶30分钟| 成人免费在线观看视频网站| 人妻少妇精品无码专区二区| 欧美专区第二页| 91九色在线观看视频| 亚洲精品高清无码视频| 日韩网站在线免费观看| 91免费视频黄|