亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

【ES6入門(mén)12】:Promise

NikoManiac / 2594人閱讀

摘要:基本用法是一種異步編程的解決方案的回調(diào)結(jié)果立馬輸出,秒之后輸出如果過(guò)程變得復(fù)雜,,用回調(diào)來(lái)處理會(huì)使代碼變得復(fù)雜代碼復(fù)雜影響后期維護(hù),很難一眼看出回調(diào)之間的順序問(wèn)題,代碼難以閱讀的返回一個(gè)對(duì)象實(shí)例,這個(gè)實(shí)例具有方法,就是執(zhí)行下一步的功能表示執(zhí)

Promise基本用法

Promise是一種異步編程的解決方案

1.es5的回調(diào)

{
    let ajax = function (callback) {
        console.log("run1");
        setTimeout(function () {
            callback && callback.call();
        }, 1000);
    };
    ajax(function () {
        console.log("timeout1");
    });
    // 結(jié)果:立馬輸出 run1,1秒之后輸出 timeout1
    // 1.如果過(guò)程變得復(fù)雜,a()=>b()=>c()=>d()... ,用回調(diào)來(lái)處理會(huì)使代碼變得復(fù)雜
    // 2.代碼復(fù)雜影響后期維護(hù),很難一眼看出回調(diào)之間的順序問(wèn)題,代碼難以閱讀
}

2.es6的Promise

{
    let ajax = function () {
        console.log("run2");
        // 返回一個(gè)對(duì)象(Promise實(shí)例),這個(gè)實(shí)例具有then()方法,就是執(zhí)行下一步的功能
        return new Promise(function (resolve, reject) {
            // resolve表示執(zhí)行下一步操作 reject表示中斷當(dāng)前操作
            setTimeout(function () {
                resolve();
            }, 1000);
        });
    };
    ajax().then(function () {
        // 這個(gè)方法對(duì)應(yīng)resolve
        console.log("timeout2");
    }, function () {
        // 這個(gè)方法對(duì)應(yīng)reject
    });
    // 結(jié)果:立馬輸出 run2,1秒之后輸出 timeout2
    // 結(jié)果和es5一樣,但是代碼可讀性、可維護(hù)性更高
}

3.then()的串聯(lián)操作

{
    let ajax = function () {
        console.log("run3");
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve();
            }, 2000);
        });
    };
    ajax().then(function () {
        // 返回Promise實(shí)例,通過(guò)不斷的下一步下一步,實(shí)現(xiàn)了串聯(lián)操作的結(jié)果
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve();
            }, 3000);
        });
    }).then(function () {
        console.log("timeout3");
    });
    // 結(jié)果:立馬輸出 run3,5秒之后輸出 timeout3
}

4.catch方法

{
    let ajax = function (num) {
        console.log("run4");
        return new Promise(function (resolve, reject) {
            if (num >= 5) {
                resolve();
            } else {
                throw Error(`出錯(cuò)了,${num}小于5`);
            }
        });
    };

    // catch方法用來(lái)捕獲異常
    ajax(6).then(function () {
        console.log(6);
    }).catch(function (err) {
        console.log(err);
    });
    // 結(jié)果:輸出 run4 6

    ajax(3).then(function () {
        console.log(3);
    }).catch(function (err) {
        console.log(err);
    });
    // 結(jié)果:輸出 run4  Error: 出錯(cuò)了,3小于5
}
Promise.all()

例子:所有圖片加載完再統(tǒng)一添加到頁(yè)面

{
    function loadImg(src) {
        return new Promise((resolve, reject) => {
            let img = document.createElement("img");
            img.src = src;
            // onload監(jiān)聽(tīng)圖片加載完成
            img.onload = function () {
                resolve(img);
            };
            // onerror監(jiān)聽(tīng)圖片加載失敗
            img.onerror = function (err) {
                reject(err);
            };
        });
    }
    function showImgs(imgs) {
        console.log(imgs); // [img, img, img] 三個(gè)img對(duì)象
        imgs.forEach(function (img) {
            document.body.appendChild(img);
        });
    }
    // Promise.all 把多個(gè)Promise實(shí)例當(dāng)做一個(gè)Promise實(shí)例
    // Promise.all(array).then(fn),array對(duì)應(yīng)多個(gè)Promise實(shí)例,當(dāng)所有實(shí)例狀態(tài)發(fā)生改變時(shí),新的Promise實(shí)例才會(huì)跟著發(fā)生變化
    // Promise.all也是返回Promise實(shí)例,所以也有.then()方法
    // 當(dāng)三張圖片都加載完成,才會(huì)執(zhí)行showImgs,如果其中有圖片正在加載,不會(huì)執(zhí)行showImgs,頁(yè)面上看不到任何一張圖片
    Promise.all([
        loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp"),
        loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp"),
        loadImg("https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp")
    ]).then(showImgs);
}
Promise.race()

例子:有一個(gè)圖片加載完就添加到頁(yè)面,其余的不管,只顯示最先加載完成的一張圖片

{
    function loadImg(src) {
        return new Promise((resolve, reject) => {
            let img = document.createElement("img");
            img.src = src;
            // onload監(jiān)聽(tīng)圖片加載完成
            img.onload = function () {
                resolve(img);
            };
            // onerror監(jiān)聽(tīng)圖片加載失敗
            img.onerror = function (err) {
                reject(err);
            };
        });
    }
    function showImgs(img) {
        let p = document.createElement("p");
        p.appendChild(img);
        document.body.appendChild(p);
    }
    // 當(dāng)某一張圖片率先加載完成,執(zhí)行showImgs顯示這張圖片,剩余圖片不再響應(yīng)
    Promise.race([
        loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp"),
        loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp"),
        loadImg("https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp")
    ]).then(showImgs);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98763.html

相關(guān)文章

  • ES6入門(mén)到進(jìn)階(二):循環(huán)、數(shù)組、對(duì)象

    摘要:優(yōu)點(diǎn)按需加載可以寫(xiě)中路徑也可以動(dòng)態(tài)加以后默認(rèn)就是嚴(yán)格模式,默認(rèn)嚴(yán)格模式完參考視頻資料經(jīng)典入門(mén)到進(jìn)階 上一篇:ES6入門(mén)到進(jìn)階(一):let、解構(gòu)賦值、字符串模板、函數(shù) 一、循環(huán) ES5里面新增一些東西 1.1 arr.forEach()(常用) 1. for for(let i=0; i [{t:aaaa}] let arr = [ ...

    JerryZou 評(píng)論0 收藏0
  • ES6入門(mén),看這篇就夠了

    摘要:從入門(mén)到放棄是什么,黑歷史,不講,自己百度去。類(lèi)你沒(méi)有看錯(cuò),這里面的就沒(méi)有問(wèn)題的。之前我們用過(guò),和有了,再也不用這兩個(gè)貨了。一個(gè)函數(shù),可以遍歷狀態(tài)感覺(jué)就是狀態(tài)機(jī),好吧不說(shuō)了再說(shuō)就懵逼了。 ES6從入門(mén)到放棄 1.ES6是什么,黑歷史,不講,自己百度去。 2.在瀏覽器中如何使用? 1.babel babeljs.io在線編譯 2.traceur-----Google出的編譯器,把E...

    lewinlee 評(píng)論0 收藏0
  • 前端面試題總結(jié)(js、html、小程序、React、ES6、Vue、算法、全棧熱門(mén)視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開(kāi)發(fā)和面試問(wèn)題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開(kāi)發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...

    pumpkin9 評(píng)論0 收藏0
  • 前端面試題總結(jié)(js、html、小程序、React、ES6、Vue、算法、全棧熱門(mén)視頻資源)

    摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開(kāi)發(fā)和面試問(wèn)題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開(kāi)發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...

    Carson 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<