摘要:原理分析一說明方法返回一個(gè)被拒絕的對象。實(shí)現(xiàn)創(chuàng)建一個(gè)新的對象,通過其構(gòu)造函數(shù)的參數(shù)函數(shù)對象將狀態(tài)變?yōu)椤:褪褂媒馕鲋担瑫r(shí)通過構(gòu)造函數(shù)的參數(shù)的函數(shù)對象觸發(fā)的狀態(tài)轉(zhuǎn)變,其中使用數(shù)組記錄返回值使用索引值以確保其返回值在結(jié)果集中的順序。
Promise原理分析二
前面我們分析了Promise的then和catch方法,接下來我們一起來看看reject、resolve、race和all方法的實(shí)現(xiàn)。
Note:
Promise原理分析一
reject 說明Promise.reject(reason)方法返回一個(gè)被拒絕的Promise對象。
語法
Promise.reject(new Error("something wrong")).then(null, err => { // todo }); Promise.reject(new Error("something wrong")).catch(err => { // todo });
參數(shù)
name | desc |
---|---|
reason | 被拒絕的原因。 |
創(chuàng)建一個(gè)新的Promise對象,通過其構(gòu)造函數(shù)的參數(shù)reject函數(shù)對象將狀態(tài)變?yōu)?b>rejected。
static reject(reason) { return new Promise((resovle, reject) => { reject(reason); }); }resolve 說明
Promise.resolve(value)方法返回一個(gè)以給定值解析后的Promise對象。但如果這個(gè)值是個(gè)Promise對象,返回的Promise會(huì)采用它的最終狀態(tài);否則以該值為成功狀態(tài)返回promise對象。
語法
Promise.resolve(1000).then(value => { // todo });
參數(shù)
name | desc |
---|---|
value | 用來解析待返回Promise對象的參數(shù)。(可以是一個(gè)Promise對象) |
如果是一個(gè)Promise對象,直接返回該值;否則創(chuàng)建一個(gè)新的Promise對象,通過其構(gòu)造函數(shù)的參數(shù)resolve函數(shù)對象將狀態(tài)變?yōu)?b>fulfilled。
static resolve(value) { // 如果為Promise對象,直接返回當(dāng)前值 if (value instanceof Promise) { return value; } return new Promise(resovle => { resovle(value); }); }race 說明
Promise.race(values)返回一個(gè)Promise對象,這個(gè)Promise在values中的任意一個(gè)Promise被解決或拒絕后,立刻以相同的解決值被解決或以相同的拒絕原因被拒絕。
語法
Promise.race([p1, p2]).then(value => { // todo }, reason => { // todo });
參數(shù)
name | desc |
---|---|
values | 一個(gè)Array對象。 |
使用Promise.resolve對迭代對象值進(jìn)行解析,且將新Promise的參數(shù)resolve和reject函數(shù)對象傳遞給then方法,以觸發(fā)新Promise對象的狀態(tài)轉(zhuǎn)換。
static race(values) { // 校驗(yàn)values參數(shù)是否為數(shù)組 if (!isArray(values)) { return Promise.reject(new Error("Promise.race must be provided an Array")); } return new Promise((resovle, reject) => { values.forEach(value => { // 遍歷迭代對象 // 使用Promise.resolve解析value值(可能為Promise對象或其他值) // 將新Promise對象的resolve, reject傳遞給解析后的Promise.prototype.then Promise.resolve(value).then(resovle, reject); }); }); }all 說明
Promise.all(values)方法返回一個(gè)Promise對象,該P(yáng)romise會(huì)等values參數(shù)內(nèi)的所有值都被resolve后才被resolve,或以values參數(shù)內(nèi)的第一個(gè)被reject的原因而被reject。
語法
Promise.all([p1, p2]).then(values => { // todo });
參數(shù)
name | desc |
---|---|
values | 一個(gè)Array對象。 |
通過Promise.resolve對迭代對象值進(jìn)行解析,使用數(shù)組記錄values參數(shù)的所有值被解析后的結(jié)果,當(dāng)所有值解析后resolve,并傳遞其所有解析結(jié)果。同時(shí)傳遞reject函數(shù)對象給Promise.resolve().then參數(shù),以觸發(fā)新Promise對象的狀態(tài)轉(zhuǎn)換。
static all(values) { // 校驗(yàn)values參數(shù)是否為數(shù)組 if (!isArray(values)) { return Promise.reject(new Error("Promise.all must be provided an Array")); } return new Promise((resolve, reject) => { // 如果數(shù)組長度為0,直接resolve且結(jié)束處理 if (values.length === 0) { resolve([]); return; } const len = values.length; // 創(chuàng)建一個(gè)數(shù)組用來保存values的Promise返回值 const result = new Array(len); let remaining = len; // 處理values數(shù)組中的值 function doResolve(index, value) { Promise.resolve(value).then(val => { // 將解析后的Promise返回值保存在對應(yīng)索引的結(jié)果集中 result[index] = val; // 當(dāng)values的所有值都解析完后,調(diào)用新Promise對象的resolve函數(shù)方法, // 把所有返回值result傳遞給后續(xù)處理中,且將狀態(tài)轉(zhuǎn)換為fulfilled。 if (--remaining === 0) { resolve(result); } }, reject); } // 迭代values對象,傳遞其索引位置以確保結(jié)果值的順序 for (let i = 0; i < len; i++) { doResolve(i, values[i]); } }); }總結(jié)
Promise.reject和Promise.resolve通過Promise的構(gòu)造函數(shù)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)變。
Promise.race和Promise.all使用Promise.resolve解析values值,同時(shí)通過構(gòu)造函數(shù)的executor參數(shù)的函數(shù)對象觸發(fā)Promise的狀態(tài)轉(zhuǎn)變,其中Promise.all使用數(shù)組記錄返回值、使用索引值以確保其返回值在結(jié)果集中的順序。
關(guān)鍵知識(shí)點(diǎn)資源 完整代碼Promise
MDN
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80845.html
摘要:原理分析一對象用于異步計(jì)算。它有兩個(gè)參數(shù),分別為在成功和失敗情況下的回調(diào)函數(shù)。實(shí)現(xiàn)根據(jù)當(dāng)前狀態(tài)對回調(diào)函數(shù)進(jìn)行處理,同時(shí)返回一個(gè)新的對象,以便鏈?zhǔn)秸{(diào)用。,注冊回調(diào)函數(shù)到當(dāng)前的對象中或,立即執(zhí)行回調(diào)函數(shù)說明方法只處理被拒絕的情況,并返回一個(gè)。 Promise原理分析一 Promise對象用于異步計(jì)算。一個(gè)Promise對象代表著一個(gè)還未完成,但預(yù)期將來會(huì)完成的操作。 Note: Promi...
摘要:原理剖析第篇之服務(wù)端啟動(dòng)工作原理分析下一大致介紹由于篇幅過長難以發(fā)布,所以本章節(jié)接著上一節(jié)來的,上一章節(jié)為原理剖析第篇之服務(wù)端啟動(dòng)工作原理分析上那么本章節(jié)就繼續(xù)分析的服務(wù)端啟動(dòng),分析的源碼版本為二三四章節(jié)請看上一章節(jié)詳見原理剖析第篇之 原理剖析(第 011 篇)Netty之服務(wù)端啟動(dòng)工作原理分析(下) - 一、大致介紹 1、由于篇幅過長難以發(fā)布,所以本章節(jié)接著上一節(jié)來的,上一章節(jié)為【原...
摘要:三模式模式其實(shí)包含兩部分和。六化在編碼的時(shí)候,想要用進(jìn)行異步操作流程控制,就要將當(dāng)前的異步回調(diào)函數(shù)封裝成。 一、什么是promise/deferred 模式 promise/deferred 模式是,根據(jù)promise/A 或者它的增強(qiáng)修改版promise/A+ 規(guī)范 實(shí)現(xiàn)的promise異步操作的一種實(shí)現(xiàn)方式。 異步的廣度使用使得回調(diào),嵌套出現(xiàn),但是一但出現(xiàn)深度的嵌套,就會(huì)讓codi...
摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法檢驗(yàn),語...
摘要:如果對語法分析和預(yù)編譯,還有疑問引擎執(zhí)行的過程的理解語法分析和預(yù)編譯階段。參與執(zhí)行過程的線程分別是引擎線程也稱為內(nèi)核,負(fù)責(zé)解析執(zhí)行腳本程序的主線程例如引擎。以上便是引擎執(zhí)行宏任務(wù)的整個(gè)過程。 一、概述 js引擎執(zhí)行過程主要分為三個(gè)階段,分別是語法分析,預(yù)編譯和執(zhí)行階段,上篇文章我們介紹了語法分析和預(yù)編譯階段,那么我們先做個(gè)簡單概括,如下: 1、語法分析: 分別對加載完成的代碼塊進(jìn)行語法...
閱讀 3208·2023-04-26 01:30
閱讀 671·2021-11-08 13:15
閱讀 1791·2021-09-24 10:35
閱讀 1005·2021-09-22 15:41
閱讀 1932·2019-08-30 15:44
閱讀 597·2019-08-30 13:22
閱讀 1011·2019-08-30 13:06
閱讀 1203·2019-08-29 13:22