最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue Promise解決回調(diào)地獄問(wèn)題實(shí)現(xiàn)方法

 更新時(shí)間:2023年01月12日 15:24:57   作者:code_充電站  
這篇文章主要介紹了Vue Promise解決回調(diào)地獄問(wèn)題,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路

問(wèn)題

首先,什么是回調(diào)地獄:

  • 層嵌套的問(wèn)題。
  • 每種任務(wù)的處理結(jié)果存在兩種可能性(成功或失敗),那么需要在每種任務(wù)執(zhí)行結(jié)束后分別處理這兩種可能性。

當(dāng)一個(gè)接口需要依賴另一個(gè)接口的請(qǐng)求數(shù)據(jù)時(shí),通常有兩種解決方式

  • 將請(qǐng)求數(shù)據(jù)的接口設(shè)為同步,之后調(diào)另一個(gè)接口
  • 在請(qǐng)求數(shù)據(jù)接口的成功回調(diào)里調(diào)另一個(gè)接口

這兩種問(wèn)題在回調(diào)函數(shù)時(shí)代尤為突出。Promise 的誕生就是為了解決這兩個(gè)問(wèn)題。

典型的高階函數(shù),將回調(diào)函數(shù)作為函數(shù)參數(shù)傳給了readFile。但久而久之,就會(huì)發(fā)現(xiàn),這種傳入回調(diào)的方式也存在大坑, 比如下面這樣:

fs.readFile('1.json', (err, data) => {
    fs.readFile('2.json', (err, data) => {
        fs.readFile('3.json', (err, data) => {
            fs.readFile('4.json', (err, data) => {
            });
        });
    });
});

回調(diào)當(dāng)中嵌套回調(diào),也稱回調(diào)地獄。這種代碼的可讀性和可維護(hù)性都是非常差的,因?yàn)榍短椎膶蛹?jí)太多。而且還有一個(gè)嚴(yán)重的問(wèn)題,就是每次任務(wù)可能會(huì)失敗,需要在回調(diào)里面對(duì)每個(gè)任務(wù)的失敗情況進(jìn)行處理,增加了代碼的混亂程度。

解決方案

Promise 利用了三大技術(shù)手段來(lái)解決回調(diào)地獄:

  • 回調(diào)函數(shù)延遲綁定。
  • 返回值穿透。
  • 錯(cuò)誤冒泡。

首先來(lái)舉個(gè)例子:

let readFilePromise = (filename) => {
    fs.readFile(filename, (err, data) => {
        if(err) {
            reject(err);
        }else {
            resolve(data);
        }
    })
}
readFilePromise('1.json').then(data => {
    return readFilePromise('2.json')
});

看到?jīng)]有,回調(diào)函數(shù)不是直接聲明的,而是在通過(guò)后面的 then 方法傳入的,即延遲傳入。這就是回調(diào)函數(shù)延遲綁定。

然后我們做以下微調(diào):

let x = readFilePromise('1.json').then(data => {
    return readFilePromise('2.json')//這是返回的Promise
});
x.then(/* 內(nèi)部邏輯省略 */)

我們會(huì)根據(jù) then 中回調(diào)函數(shù)的傳入值創(chuàng)建不同類型的Promise, 然后把返回的 Promise 穿透到外層, 以供后續(xù)的調(diào)用。這里的 x 指的就是內(nèi)部返回的 Promise,然后在 x 后面可以依次完成鏈?zhǔn)秸{(diào)用。

這便是返回值穿透的效果。

這兩種技術(shù)一起作用便可以將深層的嵌套回調(diào)寫成下面的形式:

readFilePromise('1.json').then(data => {
    return readFilePromise('2.json');
}).then(data => {
    return readFilePromise('3.json');
}).then(data => {
    return readFilePromise('4.json');
});

這樣就顯得清爽了許多,更重要的是,它更符合人的線性思維模式,開發(fā)體驗(yàn)也更好。

兩種技術(shù)結(jié)合產(chǎn)生了鏈?zhǔn)秸{(diào)用的效果。

這解決的是多層嵌套的問(wèn)題,那另一個(gè)問(wèn)題,即每次任務(wù)執(zhí)行結(jié)束后分別處理成功和失敗的情況怎么解決的呢?

Promise采用了錯(cuò)誤冒泡的方式。其實(shí)很簡(jiǎn)單理解,我們來(lái)看看效果:

readFilePromise('1.json').then(data => {
    return readFilePromise('2.json');
}).then(data => {
    return readFilePromise('3.json');
}).then(data => {
    return readFilePromise('4.json');
}).catch(err => {
  // xxx
})

這樣前面產(chǎn)生的錯(cuò)誤會(huì)一直向后傳遞,被catch接收到,就不用頻繁地檢查錯(cuò)誤了。

到此這篇關(guān)于Vue Promise解決回調(diào)地獄問(wèn)題實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Vue Promise回調(diào)地獄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript vue.js表格分頁(yè),ajax異步加載數(shù)據(jù)

    Javascript vue.js表格分頁(yè),ajax異步加載數(shù)據(jù)

    這篇文章主要介紹了Javascript vue.js表格分頁(yè),ajax異步加載數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Vue開發(fā)實(shí)現(xiàn)滑動(dòng)驗(yàn)證組件

    Vue開發(fā)實(shí)現(xiàn)滑動(dòng)驗(yàn)證組件

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue開發(fā)實(shí)現(xiàn)簡(jiǎn)單的滑動(dòng)驗(yàn)證組件,并且適配移動(dòng)和PC,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • Vue 封裝公告滾動(dòng)的方法

    Vue 封裝公告滾動(dòng)的方法

    文章介紹了如何在需求系統(tǒng)中創(chuàng)建一個(gè)位于頁(yè)面上方的公告展示組件,展示了如何在App.vue或其他頁(yè)面組件中使用這個(gè)公告組件,感興趣的朋友一起看看吧
    2025-01-01
  • vue語(yǔ)法之拼接字符串的示例代碼

    vue語(yǔ)法之拼接字符串的示例代碼

    本篇文章主要介紹了vue語(yǔ)法之拼接字符串的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • vue實(shí)現(xiàn)文字滾動(dòng)效果

    vue實(shí)現(xiàn)文字滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)文字滾動(dòng)效果,公告滾動(dòng)播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue 無(wú)限滾動(dòng)加載指令實(shí)現(xiàn)方法

    Vue 無(wú)限滾動(dòng)加載指令實(shí)現(xiàn)方法

    這篇文章主要介紹了Vue 無(wú)限滾動(dòng)加載指令的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • vue@cli3項(xiàng)目模板怎么使用public目錄下的靜態(tài)文件

    vue@cli3項(xiàng)目模板怎么使用public目錄下的靜態(tài)文件

    這篇文章主要介紹了vue@cli3項(xiàng)目模板怎么使用public目錄下的靜態(tài)文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解vue-cli項(xiàng)目開發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求

    詳解vue-cli項(xiàng)目開發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求

    這篇文章主要介紹了詳解vue-cli項(xiàng)目開發(fā)/生產(chǎn)環(huán)境代理實(shí)現(xiàn)跨域請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 詳解vite如何支持cjs方案示例

    詳解vite如何支持cjs方案示例

    這篇文章主要介紹了vite如何支持cjs方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • vue 判斷元素內(nèi)容是否超過(guò)寬度的方式

    vue 判斷元素內(nèi)容是否超過(guò)寬度的方式

    這篇文章主要介紹了vue 判斷元素內(nèi)容是否超過(guò)寬度的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07

最新評(píng)論

桂平市| 聂拉木县| 广水市| 江阴市| 开封县| 中山市| 宜州市| 威信县| 洛扎县| 双桥区| 盐山县| 偏关县| 英吉沙县| 仁化县| 文山县| 巴南区| 湖口县| 荥经县| 玉溪市| 中牟县| 柳江县| 黔西县| 黄梅县| 通海县| 繁昌县| 沙雅县| 志丹县| 三穗县| 黔西县| 定襄县| 衡阳县| 浮梁县| 瑞金市| 昌吉市| 淮北市| 凤冈县| 定襄县| 泌阳县| 梅河口市| 环江| 乃东县|