鍘熸枃鍙戣〃浜庯細鎵嬪啓鎵胯鐩稿叧鏂规硶銆侫bstractPromise浣滀负JS绀惧尯涓殑寮傛瑙e喅鏂规锛屼负寮€鍙戣€呮彁渚?then()銆丳romise.resolve()銆丳romise.reject()绛夊熀鏈柟娉曘€傛澶栵紝涓轰簡鏇存柟渚垮湴缁勫悎鍜屾帶鍒跺涓狿romise瀹炰緥锛岃繕鎻愪緵浜?all()鍜?race()绛夋柟娉曘€傛湰鏂囧皢鍦≒romise鐨勫熀鏈柟娉曠殑鍩虹涓婃墜鍔ㄥ疄鐜版洿楂樼骇鐨勬柟娉曪紝鍔犳繁瀵筆romise鐨勭悊瑙o細馃锔忓疄鐜癙romise.all馃锔忓疄鐜癙romise.race馃锔忓疄鐜癙romise.any馃锔忓疄鐜癙romise.allSettled馃锔忓疄鐜癙romise.finally鈿狅笍瀹屾垚For浠g爜鍜岀敤渚嬭鍒癵ithub.com/donghuanxin/diy-promise銆傚疄鏂絇romise.all杩囩▼Promise.all(iterators)杩斿洖涓€涓柊鐨凱romise瀹炰緥銆傝凯浠e櫒鍖呭惈澶氫釜浠庡鐣屼紶鍏ョ殑promise瀹炰緥銆傚浜庤繑鍥炵殑鏂癙romise瀹炰緥锛屾湁浠ヤ笅涓ょ鎯呭喌锛氬鏋滀紶鍏ョ殑鎵€鏈塸romise瀹炰緥鐨勭姸鎬侀兘鍙樹负fulfilled锛屽垯杩斿洖鐨刾romise瀹炰緥鐨勭姸鎬佷负fulfilled锛屽叾鍊肩敱鎵€鏈夌殑鍊肩粍鎴愪紶鍏ョ殑promises鏁扮粍銆傚鏋減romise瀹炰緥鐘舵€佸彉涓烘嫆缁濓紝鍒欒繑鍥炵殑promise瀹炰緥鐨勭姸鎬佺珛鍗冲彉涓烘嫆缁濄€備唬鐮佸疄鐜版€濊矾锛氫紶鍏ョ殑鍙傛暟涓嶄竴瀹氭槸鏁扮粍瀵硅薄锛屽彲浠ユ槸鈥滈亶鍘嗗櫒鈥濆苟涓斾紶鍏ョ殑姣忎釜瀹炰緥涓嶄竴瀹氭槸promise锛岄渶瑕佸€熷姪涓€涓€渃ounter鈥濇潵鏍囪鎵€鏈夊疄渚嬬殑鐘舵€佹槸鍚﹀彉涓篺ulfilledPromise.myAll=function(iterators){constpromises=Array.from(iterators);constnum=promises.length;constresolvedList=newArray(num);璁﹔esolvedNum=0;returnnewPromise((resolve,reject)=>{promises.forEach((promise,index)=>{Promise.resolve(promise).then(value=>{//淇濆瓨杩欎釜promise瀹炰緥鐨勫€紃esolvedList[index]=value;//浼犻€掕鏁板櫒锛屾爣璁版槸鍚︽墍鏈夊疄渚嬮兘婊¤冻if(++resolvedNum===num){resolve(resolvedList);}}).catch(reject);});});};瀹炵幇Promise.race杩囩▼Promise.race(iterators)鐨勫弬鏁颁紶閫掑拰杩斿洖鍊间笌Promise.all鐩稿悓銆備絾鏄畠杩斿洖鐨刾romise瀹炰緥鐨勭姸鎬佸拰鍊煎畬鍏ㄥ彇鍐充簬锛氬湪浼犲叆鐨勬墍鏈塸romise瀹炰緥涓紝鍝釜鍏堟敼鍙樼姸鎬侊紙鏄痜ulfilled杩樻槸rejected锛夈€備唬鐮佸疄鐜版€濊矾锛氬綋涓€涓紶鍏ョ殑瀹炰緥澶勪簬pending->fulfilled鏃讹紝瀹冪殑鍊煎氨鏄疨romise.race杩斿洖鐨刾romise瀹炰緥鐨勫€笺€傚綋涓€涓紶鍏ョ殑瀹炰緥澶勪簬pending->rejected鏃讹紝瀹冪殑閿欒鏄疨romise.race杩斿洖鐨刾romise瀹炰緥鐨別rrorPromise銆俶yRace=function(iterators){constpromises=Array.from(iterators);returnnewPromise((resolve,reject)=>{promises.forEach((promise,index)=>{Promise.resolve(promise).then(resolve).catch(reject);});});};瀹炵幇Promise.any鎴戞槸鍓嶇鎶€鏈崥瀹⑩€渪in-tan.com鈥濈殑浣滆€呫€傛偍鍙互閫氳繃Watch鎴朣tar鏂囩珷浠撳簱鈥済ithub.com/donghubxin/blog鈥濇帴鏀舵渶鏂版秷鎭紝鎴栧叧娉ㄥ叕浼楀彿鈥滃績鍧涘崥瀹⑩€濄€侾romise.any(iterators)杩囩▼鐨勫弬鏁颁紶閫掑拰杩斿洖鍊间笌Promise.all鐩稿悓銆傚鏋滀换浣曚紶鍏ョ殑瀹炰緥鍙樹负fulfilled锛屽垯瀹冭繑鍥炵殑promise瀹炰緥鐨勭姸鎬佺珛鍗冲彉涓篺ulfilled锛涘鏋滄墍鏈夊疄渚嬮兘琚嫆缁濓紝鍒欏畠杩斿洖鐨刾romise瀹炰緥鐨勭姸鎬佸皢鍙樹负琚嫆缁濄€傗殸锔廝romise.all鍜孭romise.any鐨勫叧绯荤被浼间簬Array.prototype.every鍜孉rray.prototype.some鐨勫叧绯汇€備唬鐮佸疄鐜版€濊矾涓嶱romise.all绫讳技銆備絾鏄敱浜庡紓姝ヨ繘绋嬬殑澶勭悊閫昏緫涓嶅悓锛岃繖閲岀殑璁℃暟鍣ㄧ敤浜庢爣璇嗘槸鍚︽墍鏈夊疄渚嬮兘琚嫆缁濄€侾romise.any=function(iterators){constpromises=Array.from(iterators);constnum=promises.length;constrejectedList=newArray(num);璁﹔ejectedNum=0;returnnewPromise((resolve,reject)=>{promises.forEach((promise,index)=>{Promise.resolve(promise).then(value=>resolve(value)).catch(error=>{rejectedList[index]=error;if(++rejectedNum===num){reject(rejectedList);}});});});};瀹炴柦Promise.allSettled娴佺▼銆侾romise.allSettled(iterators)鐨勫弬鏁板拰杩斿洖鍊间笌Promise.all鐩稿悓銆傛牴鎹瓻S2020锛岃繖涓繑鍥炵殑promise瀹炰緥鐨勭姸鎬佸彧鑳芥槸fulfilled銆傚浜庝紶鍏ョ殑鎵€鏈塸romise瀹炰緥锛屽畠浼氱瓑寰呮瘡涓猵romise瀹炰緥缁撴潫骞惰繑鍥炴寚瀹氱殑鏁版嵁鏍煎紡銆傚鏋滀紶鍏ヤ袱涓猵romise瀹炰緥a鍜宐锛歛琚嫆缁濓紝閿欒涓篹rror1锛沚鍙樹负fulfilled锛屽€间负1銆傞偅涔圥romise.allSettled杩斿洖鐨刾romise瀹炰緥鐨勫€间负锛歔{status:"rejected",value:error1},{status:"fulfilled",value:1}];浠g爜瀹炵幇涓殑璁℃暟鍣ㄧ敤浜庣粺璁℃墍鏈夐€氳繃浼犲叆鐨刾romise瀹炰緥銆俢onstformatSettledResult=(success,value)=>鎴愬姛?{status:"fulfilled",value}:{status:"rejected",reason:value};Promise.allSettled=function(iterators){constpromises=Array.from(杩唬鍣?;constnum=鎵胯銆傞暱搴?constsettledList=newArray(num);璁﹕ettledNum=0;returnnewPromise(resolve=>{promises.forEach((promise,index)=>{Promise.resolve(promise).then(value=>{settledList[index]=formatSettledResult(true,value);if(++settledNum===num){resolve(settledList);}}).catch(error=>{settledList[index]=formatSettledResult(false,error);if(++settledNum===num){resolve(settledList);}});});});};Promise.all銆丳romise.any鍜孭romise.allSettled涓殑璁℃暟鍣ㄤ娇鐢ㄦ瘮杈冭繖涓変釜鏂规硶閮戒娇鐢ㄤ簡璁℃暟鍣ㄨ繘琛屽紓姝ユ祦绋嬫帶鍒躲€備笅琛ㄦí鍚戝姣斾簡涓嶅悓鏂规硶涓鏁板櫒鐨勪娇鐢紝鍔犲己鐞嗚В锛歅romise.allSettled鐨勫疄渚嬫暟鏍囪浜嗗疄鐜癙romise.prototype.finally娴佺▼鐨勬墍鏈夊疄渚嬶紙宸插畬鎴愬拰宸叉嫆缁濓級鐨勬暟閲忋€傚畠鏄竴涓娉曠硸锛屼細鍦ㄥ綋鍓峱romise瀹炰緥鎵цthen鎴朿atch鍚庤Е鍙戙€備緥濡傦紝涓€涓狿romise搴旇鍦╰hen鍜宑atch涓墦鍗版椂闂存埑锛歯ewPromise(resolve=>{setTimeout(()=>resolve(1),1000);}).then(value=>console.log(Date.now())).catch(error=>console.log(Date.now()));鐜板湪杩欎釜蹇呴』鎵ц鐨勯€氱敤閫昏緫鍙互绠€鍐欎负finally锛歯ewPromise(resolve=>{setTimeout(()=>resolve(1),1000);}).finally(()=>console.log(Date.鐜板湪锛堬級锛夛級;鍙互鐪嬪嚭锛孭romise.prototype.finally鐨勬墽琛屼笌promise瀹炰緥鐨勭姸鎬佹棤鍏筹紝涓嶄緷璧栦簬promise鎵ц鍚庤繑鍥炵殑缁撴灉鍊笺€傚畠鐨勪紶鍏ュ弬鏁版槸涓€涓嚱鏁板璞°€備唬鐮佸疄鐜版€濊矾锛氳€冭檻鍒皃romise鐨剅esolver鍙兘鏄竴涓紓姝ュ嚱鏁帮紝鍦╢inally瀹炵幇涓皟鐢ㄥ疄渚嬩笂鐨則hen鏂规硶骞舵坊鍔犲洖璋冮€昏緫鎴愬姛閫忎紶value锛岄€忎紶澶辫触errorPromise.prototype.finally=function(cb){returnthis.then(value=>Promise.resolve(cb()).then(()=>value),error=>Promise.resolve(cb()).then(()=>{鎶涘嚭閿欒;}));};鍙傝€冮摼鎺ヤ腑鐨勪唬鐮佸拰鐢ㄤ緥鍦細github.com/dongyuanxin/diy-promise銆奅CMAScript 6 鍏ラ棬-Promise 瀵硅薄銆媑ithub.com/tc39/proposal-promise-allSettledgithub.com/matthew-andrews/Promise.prototype.finally濡傛灉浣犲彂鐜版湁鏀惰幏锛屾杩庡叧娉╓atch鎴朣tar鏂囩珷浠撳簱鈥済ithub.com/dongyuanxin/blog鈥濓紝鎴栨壂鎻忎簩缁寸爜鍏虫敞鍏紬鍙封€滃績鍧涘崥瀹⑩€濊В閿佹洿澶氭枃绔犮€?/p>
