摘要:依次循環(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
摘要:實(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...
摘要:遍歷器原有的表示集合的數(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...
摘要:變量的說(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),可以在...
摘要:如果我們只有一個(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ù),基本上所有的異步操作都可以...
摘要:學(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天生的與...
閱讀 3865·2021-09-23 11:51
閱讀 3057·2021-09-22 15:59
閱讀 856·2021-09-09 11:37
閱讀 2064·2021-09-08 09:45
閱讀 1260·2019-08-30 15:54
閱讀 2056·2019-08-30 15:53
閱讀 485·2019-08-29 12:12
閱讀 3283·2019-08-29 11:15