国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js手動(dòng)實(shí)現(xiàn)promise

VPointer / 870人閱讀

摘要:依次循環(huán)直到當(dāng)前沒(méi)有子如何讓異步的在函數(shù)中拿到將函數(shù)和放入同一個(gè)對(duì)象對(duì)象里面的時(shí)候?qū)⒃O(shè)置。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果。就算改變已經(jīng)發(fā)生了,你再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。

let promise = new Promise((resolve111, reject) => {
    //這里放入我們要執(zhí)行的函數(shù),可能是同步,也可能是異步, 這里我們就來(lái)寫一個(gè)異步的執(zhí)行
    setTimeout(() => {
        resolve111("hello");
    }, 100)
})
    
promise.then(data => {
    console.log(data);
    return new Promise(function(res, rej) {
        setTimeout(function() {
            console.log(2);
            res();
        }, 100)
    })
}, err => {console.log(err)})

promise的執(zhí)行流程如如下:

var i = 1
function Promise(fn) {
    this.id = i++;
    this.status = "PENDING";
    this.value = null;
    this.deffered = [];
    fn.call(this, this.resolve.bind(this), this.reject.bind(this))
}

Promise.prototype = {
    constructor: Promise,
    then: function(onfulfilled, onrejected) {
        var obj = {
            onfulfilled: onfulfilled,
            onrejected: onrejected
        }
        obj.promise = new this.constructor(function() {});
        console.log(this.status)
        if (this.status === "PENDING") {
            this.deffered.push(obj);
        }
        console.log(this.deffered)
        return obj.promise;
    },
    resolve: function(data) {
        this.status = "FULFILLED";
        this.value = data;
        this.deffered.forEach(item => {
            let p = item.onfulfilled(this.value);
            if (p && p.constructor === Promise) {
                p.deffered = item.promise.deffered;
            }
        });
    },
    reject: function(err) {
        this.status = "REJECTED";
        this.value = err;
        this.deffered.forEach(item => {
            let p = item.onrejected(this.value);
            if (p && p.constructor === Promise) {
                p.deffered = item.promise.deffered;
            }
        });
    }
}

then方法需要返回一個(gè)新的子Promise, 并且前后的Promise需要建立聯(lián)系,才能決定他們的執(zhí)行順序。這里用id標(biāo)識(shí)每個(gè)promise。

Promise鏈?zhǔn)讲僮髦校瑘?zhí)行順序是如何保證的

每個(gè)promise后面鏈一個(gè)對(duì)象該對(duì)象包含onfulfiled,onrejected,子promise三個(gè)屬性,當(dāng)父promise 狀態(tài)改變完畢,執(zhí)行完相應(yīng)的onfulfiled/onfulfiled的時(shí)候呢,拿到子promise,在等待這個(gè)子promise狀態(tài)改變,再執(zhí)行相應(yīng)的onfulfiled/onfulfiled。依次循環(huán)直到當(dāng)前promise沒(méi)有子promise


如何讓異步的value在thenable函數(shù)中拿到

將resolve/reject函數(shù)和onfulfiled/onrejected放入同一個(gè)對(duì)象(promise對(duì)象)里面,resolve/reject的時(shí)候?qū)alue設(shè)置this.value=xxx。onfulfiled/onrejected執(zhí)行的時(shí)候呢,onfulfiled(this.value)即可。

在這里避免頭暈,解釋一下,onfulfilled和onrejected指的是then里面的兩個(gè)函數(shù)。

狀態(tài)機(jī)制切換

 如圖所示,狀態(tài)只能由pengding-->fulfilled,或者由pending-->rejected這樣轉(zhuǎn)變。

 只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果。就算改變已經(jīng)發(fā)生了,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過(guò)了它,再去監(jiān)聽,是得不到結(jié)果的。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100869.html

相關(guān)文章

  • js來(lái)聊聊異步編程

    摘要:實(shí)例生成以后,可以用方法分別指定狀態(tài)和狀態(tài)的回調(diào)函數(shù)處理返回的結(jié)果。 文章的目的 揭開go的 gorouter,c#的 async/await等 使用同步的寫法寫異步代碼的神秘面紗 , 證明其本質(zhì)就是一個(gè)語(yǔ)法糖 為什么使用js來(lái)講異步編程 因?yàn)閖s可以通過(guò)編程語(yǔ)言自己的語(yǔ)法特性,實(shí)現(xiàn)async/await語(yǔ)法 js異步最底層寫法promise const promise = new P...

    huashiou 評(píng)論0 收藏0
  • 異步發(fā)展流程 —— Generators + co 讓異步更優(yōu)雅

    摘要:遍歷器原有的表示集合的數(shù)據(jù)結(jié)構(gòu),主要有和,在中又加入了和,這樣就有了四種數(shù)據(jù)集合,還可以組合使用它們,如數(shù)組的成員是或,這樣就需要一種統(tǒng)一的接口機(jī)制,用來(lái)處理所有不同的數(shù)據(jù)結(jié)構(gòu)。 showImg(https://segmentfault.com/img/remote/1460000018998438?w=900&h=431); 閱讀原文 Generators 簡(jiǎn)介 Generato...

    dingda 評(píng)論0 收藏0
  • node.js與ThreadLocal

    摘要:變量的說(shuō)法來(lái)自于,這是在多線程模型下出現(xiàn)并發(fā)問(wèn)題的一種解決方案。目前已經(jīng)有庫(kù)實(shí)現(xiàn)了應(yīng)用層棧幀的可控編碼,同時(shí)可以在該棧幀存活階段綁定相關(guān)數(shù)據(jù),我們便可以利用這種特性實(shí)現(xiàn)類似多線程下的變量。 ThreadLocal變量的說(shuō)法來(lái)自于Java,這是在多線程模型下出現(xiàn)并發(fā)問(wèn)題的一種解決方案。ThreadLocal變量作為線程內(nèi)的局部變量,在多線程下可以保持獨(dú)立,它存在于線程的生命周期內(nèi),可以在...

    jasperyang 評(píng)論0 收藏0
  • js 處理異步操作的幾種方式

    摘要:如果我們只有一個(gè)異步操作,用回調(diào)函數(shù)來(lái)處理是完全沒(méi)有任何問(wèn)題的。事件監(jiān)聽使用事件監(jiān)聽的方式番禺廣州上述代碼需要實(shí)現(xiàn)一個(gè)事件監(jiān)聽器。只處理對(duì)象廣州番禺函數(shù)將函數(shù)的自動(dòng)執(zhí)行器,改在語(yǔ)言層面提供,不暴露給用戶。 概論 由于 JavaScript 是一門單線程執(zhí)行的語(yǔ)言,所以在我們處理耗時(shí)較長(zhǎng)的任務(wù)時(shí),異步編程就顯得尤為重要。js 處理異步操作最傳統(tǒng)的方式是回調(diào)函數(shù),基本上所有的異步操作都可以...

    Meils 評(píng)論0 收藏0
  • js學(xué)習(xí)之異步處理

    摘要:學(xué)習(xí)開發(fā),無(wú)論是前端開發(fā)還是都避免不了要接觸異步編程這個(gè)問(wèn)題就和其它大多數(shù)以多線程同步為主的編程語(yǔ)言不同的主要設(shè)計(jì)是單線程異步模型。由于異步編程可以實(shí)現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開發(fā),無(wú)論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個(gè)問(wèn)題,就和其它大多數(shù)以多線程同步為主的編程語(yǔ)言不同,js的主要設(shè)計(jì)是單線程異步模型。正因?yàn)閖s天生的與...

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

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

0條評(píng)論

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