欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

問題

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

  • 層嵌套的問題。
  • 每種任務(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è)接口

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

典型的高階函數(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ù)可能會(huì)失敗,需要在回調(diào)里面對(duì)每個(gè)任務(wù)的失敗情況進(jìn)行處理,增加了代碼的混亂程度。

解決方案

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

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

首先來舉個(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ù)不是直接聲明的,而是在通過后面的 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)用的效果。

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

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

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

相關(guān)文章

  • 3分鐘讀懂移動(dòng)端rem使用方法(推薦)

    3分鐘讀懂移動(dòng)端rem使用方法(推薦)

    這篇文章主要介紹了rem使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue中對(duì)iframe實(shí)現(xiàn)keep alive無刷新的方法

    Vue中對(duì)iframe實(shí)現(xiàn)keep alive無刷新的方法

    這篇文章主要介紹了Vue中對(duì)iframe實(shí)現(xiàn)keep alive無刷新的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • vue實(shí)現(xiàn)分割驗(yàn)證碼效果

    vue實(shí)現(xiàn)分割驗(yàn)證碼效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)分割驗(yàn)證碼效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue中input被賦值后,無法再修改編輯的問題及解決

    Vue中input被賦值后,無法再修改編輯的問題及解決

    這篇文章主要介紹了Vue中input被賦值后,無法再修改編輯的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue 圖標(biāo)選擇器的實(shí)例代碼

    vue 圖標(biāo)選擇器的實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了vue 圖標(biāo)選擇器的相關(guān)知識(shí),圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • 解決vue.js中settimeout遇到的問題(時(shí)間參數(shù)短效果不穩(wěn)定)

    解決vue.js中settimeout遇到的問題(時(shí)間參數(shù)短效果不穩(wěn)定)

    這篇文章主要介紹了解決vue.js中settimeout遇到的問題(時(shí)間參數(shù)短效果不穩(wěn)定),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue中前后端使用WebSocket詳細(xì)代碼實(shí)例

    Vue中前后端使用WebSocket詳細(xì)代碼實(shí)例

    websocket通信是很好玩的,也很有用的的通信方式,下面這篇文章主要給大家介紹了關(guān)于Vue中前后端使用WebSocket的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Vue3 之 Vue 事件處理指南

    Vue3 之 Vue 事件處理指南

    Vue事件處理是每個(gè)Vue項(xiàng)目的必要方面。 它用于捕獲用戶輸入,共享數(shù)據(jù)以及許多其他創(chuàng)造性方式。在本文中,會(huì)介紹基礎(chǔ)知識(shí),并提供一些用于處理事件的代碼示例。需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Uniapp中WebView的使用與后退鍵處理教程

    Uniapp中WebView的使用與后退鍵處理教程

    在Uniapp中使用web-view組件來加載H5頁面時(shí),對(duì)于后退鍵的處理是一個(gè)常見需求,下面這篇文章主要給大家介紹了關(guān)于Uniapp中WebView的使用與后退鍵處理的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • vue 實(shí)現(xiàn)上傳按鈕的樣式的兩種方法

    vue 實(shí)現(xiàn)上傳按鈕的樣式的兩種方法

    這篇文章主要介紹了vue 定制上傳按鈕的樣式的兩種方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論