在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

promise對象的深入解析(附示例)

promise對象的深入解析(附示例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于promise對象的深入解析(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

js中的異步,剛開始的時候都是用回調函數實現的,所以如果異步嵌套的話,就有出現回調地獄,使得代碼難以閱讀和難以維護,后來es6出現了promise,解決了回調地獄的問題。現在我們就自己寫代碼實現一下promise,這樣才能深入理解promise的運行機制,對以后使用promise也能夠更加得心應手。開始之前可以先看下promise的官網promise/A+

先來看下promise的用法

new Promise((resolve,reject)=>{
  resolve(1);
  reject(11);
}).then(res=>{
  console.log(res);
  setTimeout(()=>{
    return new Promise((resolve,reject)=>{
        resolve(2)
    }) 
  },1000)
}).then(res2=>{
  console.log(res2);
});

控制臺打印
1
...1s later
2

先分析下上面這段代碼,先提出幾個問題
1.第一段resolve和reject都有,但是只輸出了1,為什么?
2.then里的res是如何取到resolve中的值的?
3.promise是如何做到鏈式調用的?

狀態機

promise中有個狀態機的概念,先說下為什么要有狀態機的概念呢,因為promise的狀態是單向變化的,有三種狀態,pending,fullfilled,rejected,而這三種狀態只能從pending->fullfilled或者pending->rejected這兩種形式,也就是說執行了fullfilled之后,就不會執行rejected。這就解釋了上面的第一個問題。

下面我們來看下具體實現的完整代碼

const PENDING = 'PENDING';
const FULLFILLED = 'FULLFILLED';
const REJECTED = 'REJECTED';    
class Promise{
    constructor(fn){
       this.status = PENDING;//狀態
        this.data = undefined;//返回值
        this.defercb = [];//回調函數數組
        //執行promise的參數函數,并把resolve和reject的this綁定到promise的this
        fn(this.resolve.bind(this),this.reject.bind(this));
    }
    resolve(value){
        if(this.status === PENDING){
            //只能pending=>fullfied
            this.status = FULLFILLED;
            this.data = value;
            this.defercb.map(item=>item.onFullFilled());
        }
    }
    reject(value){
        if(this.status === PENDING){
            //只能pending=>rejected
            this.status = REJECTED;
            this.data = value;
            this.defercb.map(item=>item.onRejected());
        }
    }
    then(resolveThen,rejectThen){
       //如果沒有resolveThen方法,保證值可以穿透到下一個then里有resolveThen的方法中
        resolveThen = typeof resolveThen === 'function' ? resolveThen : function(v) {return v};
        rejectThen = typeof rejectThen === 'function' ? rejectThen : function(r) {return r};
        //返回的都是promise對象,這樣就可以保證鏈式調用了
        switch(this.status){
            case PENDING:
            return new Promise((resolve,reject)=>{
                const onFullFilled = () => {
                    const result = resolveThen(this.data);//這里調用外部then的resolveThen方法,將值傳回去
                    //如果返回值是promise對象,執行then方法,取它的結果作為新的promise實例的結果,因為this.data會重新賦值
                    result instanceof Promise && result.then(resolve,reject);
                }
                const onRejected = ()=>{
                    const result = rejectThen(this.data);
                    result instanceof Promise && result.then(resolve,reject);
                }
                this.defercb.push({onFullFilled,onRejected});
            });
            break;
            case FULLFILLED:
               return new Promise((resolve,reject)=>{
                     const result = resolveThen(this.data);
                     result instanceof Promise && result.then(resolve,reject);
                     resolve(result);
               })
            break;
            case REJECTED:
               return new Promise((resolve,reject)=>{
                   const result = rejectThen(this.data);
                   result instanceof Promise && result.then(resolve,reject);
                   reject(result)
               })   
            break;
        }
    }
}

運行下面的例子

new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(1);
    }, 1000);
}).then((res2) => {
    console.log(res2);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2);
        }, 1000);
    });
}).then((res3) => {
    console.log(res3);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(3);
        }, 1000);
    });
}).then((res4) => {
    console.log(res4);
});

控制臺打印
...1s later
1
...1s later
2
...1s later
3
說明上面的實現是沒有問題的
不過還有一個問題,就是事件循環的順序問題,比如執行下面的代碼

new Promise((resolve) => {
    resolve();
})
.then(() => {
    console.log('1');
})
.then(() => {
    console.log('2');
});
console.log('3');

并沒有像預想中輸出3,1,2,而是輸出了1,2,3,原因就是因為我們的這個Promise是在主線程中,沒有在下一個任務隊列中,可以加上settimeout解決這個問題,不過這也只是為了讓我們更好理解執行順序而已,然而實際上是promise是屬于微任務中的,而settimeout是屬于宏任務,還是不太一樣的

以上就是promise對象的深入解析(附示例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 伊人网在线综合| 亚洲 欧美 另类人妖| 男生操女生视频在线观看| r级无码视频在线观看| 一本二本三本亚洲码| 999精品视频在线| 好男人www社区| 国产精品无码专区av在线播放 | 国内外免费激情视频| 国产一区二区三区乱码| 国产精品一二三在线观看| 日本免费在线视频观看| 国产三级精品三级在线| 在线播放免费视频| 亚洲精品mv在线观看| 亚洲天堂一区二区在线观看| 91免费视频污| 久久99久久99精品| 国产精品裸体瑜伽视频| 91九色在线观看视频| 91黄色小网站| 日本超碰在线观看| 黄瓜视频免费观看在线观看www| 中文字幕第50页| 国产欧美日韩小视频| 免费观看国产精品视频| 成年人黄色片视频| 超碰在线资源站| www.激情网| 可以免费在线看黄的网站| 黄色国产小视频| 手机在线视频你懂的| 毛片在线视频播放| 色天使在线观看| 成人在线免费观看网址| 18禁免费无码无遮挡不卡网站 | 99999精品| jizzjizz国产精品喷水| 中文字幕av不卡在线| 99热久久这里只有精品| www.xxx亚洲| 国产1区2区3区中文字幕| 日本三级免费观看| 成年人黄色在线观看| 99色精品视频| xxxxxx在线观看| 日本www.色| 免费av手机在线观看| 手机av在线网| 欧美私人情侣网站| 日韩在线观看a| 在线观看日本www| 久久久久久久少妇| 欧美视频在线观看视频| 午夜免费视频网站| 爱情岛论坛成人| 男人天堂999| 免费国产黄色网址| 黄色一级视频播放| 黄色a级三级三级三级| 国内自拍视频一区| 久久久免费视频网站| 91免费国产精品| 亚洲天堂第一区| www.亚洲一区二区| 精品国产鲁一鲁一区二区三区| 无码无遮挡又大又爽又黄的视频| 黄色激情在线视频| 日韩亚洲欧美视频| 国产欧美日韩小视频| 三上悠亚免费在线观看| 日本三日本三级少妇三级66| 亚洲怡红院在线| 视频区 图片区 小说区| 中文 日韩 欧美| 久久久精品视频国产| 性欧美18一19内谢| 色中文字幕在线观看| 免费在线精品视频| 天堂а√在线中文在线| 日韩 欧美 自拍| 国产一区 在线播放| 男人添女人荫蒂免费视频| av在线观看地址| www国产精品内射老熟女| 久久精品99国产| www.超碰97.com| 五月天男人天堂| 午夜免费福利小电影| 国产免费黄色av| www.精品在线| 天天干天天色天天爽| 可以看毛片的网址| 91淫黄看大片| 强伦女教师2:伦理在线观看| a天堂资源在线观看| av免费网站观看| а 天堂 在线| 男人天堂1024| 91大神免费观看| 各处沟厕大尺度偷拍女厕嘘嘘| 一级黄色录像在线观看| www.69av| 国产精品一区二区羞羞答答| a级网站在线观看| 国产精品动漫网站| 桥本有菜av在线| 亚洲色图38p| 亚洲色成人www永久在线观看| 三年中国国语在线播放免费| www.国产亚洲| 日本肉体xxxx裸体xxx免费| 日韩在线观看a| 亚洲一区二区在线视频观看| 国产精品12345| 日本老太婆做爰视频| 日韩爱爱小视频| 国产成人黄色片| 少妇久久久久久被弄到高潮| 美女在线视频一区二区| 3d动漫一区二区三区| 国内精品国产三级国产99| 手机视频在线观看| 国内外成人免费激情视频| 男人天堂av片| 草草草视频在线观看| 99九九精品视频| 日本高清一区二区视频| 国产成人综合一区| 男人揉女人奶房视频60分| 九九久久九九久久| 国产日产欧美一区二区| 中文 日韩 欧美| 四虎成人在线播放| 国产亚洲视频一区| 亚洲一级免费在线观看| 色综合色综合色综合色综合| 五月天婷婷激情视频| 国内外免费激情视频| 欧美精品第三页| 精品视频一区二区在线| 国产成人精品视频免费看| 日本www在线播放| 欧美黄网站在线观看| 成人在线看视频| 国产视频一区二区视频| 色婷婷综合网站| 99999精品| 黄网站色视频免费观看| 国产美女在线一区| 日韩精品视频一区二区在线观看| 欧美 日韩 国产一区| 一区二区在线播放视频| 久热精品在线播放| 亚洲国产精品女人| 久久这里只有精品18| 欧美成人三级在线视频| 日本老熟妇毛茸茸| 一区二区三区四区毛片| 男人的天堂avav| 国产精品亚洲二区在线观看 | 成年人午夜视频在线观看| 午夜视频在线瓜伦| 国产精品亚洲天堂| 无罩大乳的熟妇正在播放| 亚洲黄色av网址| 无码毛片aaa在线| 欧美极品欧美精品欧美图片| 亚洲一区二区在线视频观看| 国产亚洲精品久久久久久久| 亚洲人成无码www久久久| 国产传媒免费观看| 极品美女扒开粉嫩小泬| 亚洲免费黄色网| 男人日女人逼逼| www.亚洲一区二区| 黄色a级片免费| 国产成人生活片| 97超碰人人爽| 国产淫片av片久久久久久| 精品国产无码在线| 手机看片福利盒子久久| 少妇一晚三次一区二区三区| 婷婷激情四射五月天| 国产精品网站免费| 亚洲成年人专区| 蜜臀av免费观看| 东京热加勒比无码少妇| 国产传媒久久久| 日本丰满大乳奶| 午夜久久福利视频| 久久国产色av免费观看| 欧美三级一级片| 久久这里只有精品18| 国产麻豆电影在线观看| 日本激情视频在线播放| 亚洲精品无码久久久久久| 久久精品xxx| 国产不卡一区二区视频| 国产一区 在线播放|