日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解Promise (4)

發布時間:2025/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解Promise (4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

then 方法必須?返回一個新的promise

promise2 = promise1.then(onFulfilled, onRejected);

新的Promise 必須返回傳遞兩個方法? onFulfilled, onRejected

If either onFulfilled or onRejected returns a value x, run the Promise Resolution Procedure [[Resolve]](promise2, x).

onFulfilled, onRejected? 其中的某個都要返回 一個value

if either?onFulfilled?or?onRejected?returns a value?x, run the Promise Resolution Procedure?[[Resolve]](promise2, x)

如果onfulled或onrejected返回值x,請運行承諾解決過程[[解決]](promise2,x)。

let x = onfulfilled(this.value);// x是普通值還是promise 如果是普通值 直接調用promise2的resolve// 如果是promise 那應該讓x這個promise執行 x.thenresolvePromise(promise2,x,resolve,reject);

這段代碼是??resolvePromise? ??承諾解決過程

resolvePromise? 這個函數里面 有Promise 這個參數,所以我們要拿到這個值 但是我們直接打印出來這個值 是 underfind 所以我們要用?promise2

這樣,我們做到這里的時候? then 方法的大概結構就出來了?

then(onfulfilled,onrejected){ let promise2;promise2 = new Promise((resolve,reject)=>{if(this.status === 'fulfilled'){setTimeout(()=>{ try{let x = onfulfilled(this.value);// x是普通值還是promise 如果是普通值 直接調用promise2的resolve// 如果是promise 那應該讓x這個promise執行 x.then resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0);}if(this.status === 'rejected'){setTimeout(()=>{try{let x = onrejected(this.reason);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)}if(this.status === 'pending'){this.resolveCallbacks.push(()=>{setTimeout(()=>{try{let x = onfulfilled(this.value);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)});this.rejectCallbacks.push(()=>{setTimeout(()=>{try{let x = onrejected(this.reason);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)})}});return promise2}

接下來我們來處理? ?The Promise Resolution Procedure? 的問題?

If?promise?and?x?refer to the same object, reject?promise?with a?TypeError?as the reason.

let resolvePromise = (promise2,x,resolve,reject) => {if(promise2 === x){return reject(new TypeError('循環引用'))} }

?if?x?is an object or function,

if(typeof x === 'function' || (typeof x === 'object' && x !== null)){}

Let?then?be?x.then

let then = x.then; // 如果取then方法出錯 那就用錯誤拒絕promise2
  • f/when?resolvePromise?is called with a value?y, run?[[Resolve]](promise, y).
  • If/when?rejectPromise?is called with a reason?r, reject?promise?with?r.
  • If both?resolvePromise?and?rejectPromise?are called, or multiple calls to the same argument are made, the first call takes precedence, and any further calls are ignored.
  • ? ? ? ?

    if(typeof then === 'function'){ // 我就認為他是一個promisethen.call(x,y=>{ // 讓當前的promise執行 ,不用多次取then方法了// y 有可能還是一個promise , 繼續調用resolvePromise方法,直到解析出一個常量為止,最終把常量傳遞下去if(called) return; // 放置此方法多次被調用called = true;resolvePromise(promise2,y,resolve,reject);},r=>{if(called) return;called = true;reject(r); // 讓當前的promise變成失敗態即可 })}else{// x就是一個普通的對象 并沒有then方法 resolve(x);}

    全部的代碼:

    ?

    let resolvePromise = (promise2,x,resolve,reject) => {// 判斷x的類型 來處理promise2是成功還是失敗// 所有的promise都遵循這個規范,不同的人寫的promise可能會混用// 盡可能考慮的周全 要考慮別人promise可能出錯的情況if(promise2 === x){return reject(new TypeError('循環引用'))}// 判斷x是不是一個promise ,這個x 可能不是自己的promise 所以為了安全 需要在進行校驗,放置調一起用成功和失敗 if(typeof x === 'function' || (typeof x === 'object' && x !== null)){// 嘗試取當前x的then方法, 這個then方法可能別人定義的時候 用的Object.defineProperty let called;try{let then = x.then; // 如果取then方法出錯 那就用錯誤拒絕promise2if(typeof then === 'function'){ // 我就認為他是一個promisethen.call(x,y=>{ // 讓當前的promise執行 ,不用多次取then方法了// y 有可能還是一個promise , 繼續調用resolvePromise方法,直到解析出一個常量為止,最終把常量傳遞下去if(called) return; // 放置此方法多次被調用called = true;resolvePromise(promise2,y,resolve,reject);},r=>{if(called) return;called = true;reject(r); // 讓當前的promise變成失敗態即可 })}else{// x就是一個普通的對象 并沒有then方法 resolve(x);}}catch(e){if(called) return;called = true;reject(e);}}else{// x肯定一個常量 resolve(x);} }class Promise{constructor(executor){this.status = 'pending'; this.value; this.reason;this.resolveCallbacks = []; // 當then是pending 我希望吧成功的方法都放到數組中this.rejectCallbacks = [];let resolve = (value)=>{if(this.status == 'pending'){this.status = 'fulfilled';this.value = value;this.resolveCallbacks.forEach(fn=>fn()); // 發布 }}let reject = (reason)=>{if(this.status === 'pending'){this.status = 'rejected';this.reason = reason;this.rejectCallbacks.forEach(fn=>fn())}}try{executor(resolve,reject);}catch(e){reject(e);}}then(onfulfilled,onrejected){ let promise2;promise2 = new Promise((resolve,reject)=>{if(this.status === 'fulfilled'){setTimeout(()=>{ try{let x = onfulfilled(this.value);// x是普通值還是promise 如果是普通值 直接調用promise2的resolve// 如果是promise 那應該讓x這個promise執行 x.then resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0);}if(this.status === 'rejected'){setTimeout(()=>{try{let x = onrejected(this.reason);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)}if(this.status === 'pending'){this.resolveCallbacks.push(()=>{setTimeout(()=>{try{let x = onfulfilled(this.value);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)});this.rejectCallbacks.push(()=>{setTimeout(()=>{try{let x = onrejected(this.reason);resolvePromise(promise2,x,resolve,reject);}catch(e){reject(e);}},0)})}});return promise2} } module.exports = Promise;

    ?

    ?

    https://promisesaplus.com/

    轉載于:https://www.cnblogs.com/guangzhou11/p/11307074.html

    總結

    以上是生活随笔為你收集整理的理解Promise (4)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产h视频在线观看 | 69xav | 人妻熟女一区二区三区app下载 | 亚洲欧美第一视频 | 日韩欧美在线视频观看 | 激情久久久久 | 亚洲一区二区三区电影在线观看 | 亚洲欧洲日产av | 嫩草影院中文字幕 | 色姑娘综合网 | 亚洲视频在线网 | 在线免费观看亚洲 | 久久精品综合 | 日韩成人在线网站 | 欧美色炮| 日韩精品在线观看视频 | 欧美精品久久久 | 久久久久噜噜噜亚洲熟女综合 | 成人网址在线观看 | 成人一二三区 | 50部乳奶水在线播放 | 国产av成人一区二区三区高清 | 99视频在线观看免费 | 精品在线免费播放 | 亚洲一区欧洲二区 | 美日韩精品 | 成人理论影院 | 韩国av一区二区 | 美女久久久久久久久 | 国产精品一区二区在线免费观看 | 一级看片| 在线视频日韩 | 在线看一区 | 久草资源福利 | 国产视频四区 | 少妇不卡视频 | 男人添女人囗交视频 | 国产欧美日韩另类 | 俄罗斯丰满熟妇hd | 色视频网站在线观看 | 日韩成人高清视频在线观看 | 色婷婷av一区二区三区麻豆综合 | 黄色av日韩 | 国产精品伦一区二区三区 | 欧美少妇激情 | 日韩爽片 | 在线资源站 | 无码一区二区三区免费 | 韩国一区视频 | 国产一国产二国产三 | 中文字幕精品一二三四五六七八 | 在线不卡av电影 | 久久久网 | 久久久久国产精品视频 | wwwsss在线观看| 亚洲永久免费网站 | 欧美一级夜夜爽 | 娇妻av| 一级特黄免费视频 | 国产麻豆午夜三级精品 | 久久大 | 国产精品一二三级 | 蜜臀久久99精品久久久久宅男 | 久久久老熟女一区二区三区91 | 一区二区三区免费看视频 | 黄色免费91| 3d动漫精品啪啪一区二区免费 | 久久久久久久一区 | 香蕉视频官网在线观看 | 国产精品视频专区 | 日韩在线视频你懂的 | 欧美人妻精品一区二区免费看 | 国产精自产拍久久久久久蜜 | 国产玖玖视频 | 亚洲熟伦熟女新五十路熟妇 | 在线观看wwww | 日在线视频 | 影音先锋中文字幕在线播放 | 午夜精品久久久久久久99 | 国产精彩视频一区 | 一级一片免费看 | 奇米网一区二区 | 精品久久无码中文字幕 | 涩涩涩涩涩涩涩涩涩涩 | 成人性生交免费看 | 成人18网站 | 视色视频 | 好吊视频一区二区 | 中文字幕av二区 | 日韩免费一区二区三区 | 免费黄在线| www.男人的天堂 | 日韩av一| 精品视频一二三 | 成人区人妻精品一区二区网站 | www.色香蕉| 亚洲天堂视频一区 | 爱就操| 天天干天天操天天射 |