ES6 - promise() 函數(shù)解決嵌套回調(diào)(回調(diào)地獄)

什么是嵌套回調(diào)(回調(diào)地獄)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        $.get("/getUser", function() {
            $.get("/getUserDetail", function() {
                $.get("/getUserOrder", function() {
                    ......
                })
            })
        })
    </script>
</body>
</html>

promise() 函數(shù)基本用法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        // 將異步操作封裝在一個(gè) promise 對(duì)象中
        function fn() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=>{
                    console.log('你好');

                    // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了;執(zhí)行 reject() 函數(shù),表示操作失敗,告訴外界可以執(zhí)行其他操作了
                    resolve();
                }, 1000);
            })
        }

        fn().then(res=>{
            console.log("首先");
        });
    </script>
</body>
</html>

以上代碼,瀏覽器打印內(nèi)容:

你好
首先

promise() 函數(shù)解決回調(diào)地獄

  • 無(wú)參數(shù)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        function f1() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=>{
                    console.log('第一步');

                    // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了
                    resolve();
                }, 1000);
            })
        }

        function f2() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=>{
                    console.log('第二步');

                    // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了
                    resolve();
                }, 1000);
            })
        }

        function f2() {
            return new Promise(function(resolve, reject) {
                setTimeout(()=>{
                    console.log('第三步');

                    // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了
                    resolve();
                }, 1000);
            })
        }

        f1().then(res=>{
            // 返回 promise 對(duì)象
            return f2();
        }).then(res=>{
            // 返回 promise 對(duì)象
            return f3();
        }).then(res=>{
            setTimeout(()=>{
                console.log('已完成');
            }, 1000);
        });
    </script>
</body>
</html>

以上代碼,瀏覽器打印內(nèi)容:

第一步
第二步
第三步
已完成
  • 有參數(shù)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        function getUser() {
            return new Promise(resolve=>{
                $.get("/getUser", res=>{
                    // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了,并將從后端獲取的數(shù)據(jù) res 傳遞給外界
                    resolve(res);
                })
            });
        }

        getUser().then(res=>{
            // res 就是上一個(gè)異步操作返回的參數(shù)值(從后端獲取的數(shù)據(jù))
            console.log(res);
        })
    </script>
</body>
</html>
  • 錯(cuò)誤處理
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        function getBooks() {
            return new Promise((resolve, reject)=>{
                $.ajax({
                    url:"/getBooks",
                    success(res) {
                        // 執(zhí)行 resolve() 函數(shù),表示操作成功,告訴外界可以執(zhí)行其他操作了,并將從后端獲取的數(shù)據(jù) res 傳遞給外界
                        resolve(res);
                    },
                    error(res) {
                        // 執(zhí)行 reject() 函數(shù),表示操作失敗,告訴外界可以執(zhí)行其他操作了,并將錯(cuò)誤信息 res 傳遞給外界
                        reject(res);
                    }
                })
            });
        }

        // 第一種處理錯(cuò)誤的方式
        getBooks().then(res=>{
            // res 就是 ajax 請(qǐng)求成功時(shí)獲取的數(shù)據(jù)
            console.log(res);
        }),resError=>{
            // resError 就是 ajax 請(qǐng)求失敗時(shí)的錯(cuò)誤信息
            console.log(resError);
        }

        // 第二種處理錯(cuò)誤的方式(推薦)
        getBooks().then(res=>{
            // res 就是 ajax 請(qǐng)求成功時(shí)獲取的數(shù)據(jù)
            console.log(res);
        }).catch(resError=>{
            // resError 就是 ajax 請(qǐng)求失敗時(shí)的錯(cuò)誤信息
            console.log(resError);
        })
    </script>
</body>
</html>

上面代碼中錯(cuò)誤處理的方式,推薦使用第二種。因?yàn)榈诙N方式不僅僅可以捕獲到 reject() 函數(shù)傳遞的參數(shù),而且還能捕獲到成功時(shí)回調(diào)函數(shù) then() 中發(fā)生的錯(cuò)誤。示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        function fn(name) {
            return new Promise(resolve=>{
                if (name == 'Tom') {
                    resolve('allow');
                }
                else {
                    reject('refuse');
                }
            })
        }
    
        fn('Tom').then(res=>{
            var a = '';
            a();

            console.log(res);
        }).catch(resError=>{
            console.log(resError);
        })
    </script>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 11,106評(píng)論 26 95
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 8,771評(píng)論 0 29
  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,823評(píng)論 1 56
  • 特別說(shuō)明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 953評(píng)論 0 2
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,557評(píng)論 0 8

友情鏈接更多精彩內(nèi)容