当前位置: 首页 > Web前端 > HTML5

2K字就能看懂的async-await原理,需要多长时间?

时间:2023-04-05 01:39:00 HTML5

鍓嶈█涓婄瘒鏂囩珷5K瀛楃敱娴呭叆娣辫浜哖romise鐨勫疄鐜板師鐞嗭紝鎻忚堪浜哖romise鐨勫唴閮ㄥ疄鐜板師鐞嗐€備粖澶╁氨鏉ヨ璇碼sync鍜宎wait锛岄偅涔坅sync鍜宎wait鍒板簳鏄粈涔堛€傝鏄娉曠硸锛岄偅鎴戜滑灏辨繁鍏ヤ簡瑙sync/await锛岀湅鐪婱DN鐨勬蹇点€傚紓姝ュ嚱鏁版槸浣跨敤async鍏抽敭瀛楀0鏄庣殑鍑芥暟銆傚紓姝ュ嚱鏁版槸AsyncFunction鏋勯€犲嚱鏁扮殑瀹炰緥锛屽苟涓斿厑璁镐娇鐢╝wait鍏抽敭瀛椼€俛wait杩愮畻绗︾敤浜庣瓑寰匬romise瀹屾垚骞跺湪瀹屾垚鍚庤幏鍙栧叾鍊笺€傚畠鍙兘鍦ㄥ紓姝ュ嚱鏁板唴閮ㄦ垨妯″潡鐨勯《灞備娇鐢ㄣ€俛sync鍜宎wait鍏抽敭瀛楀厑璁告垜浠互鏇寸畝娲佺殑鏂瑰紡缂栧啓鍩轰簬Promise鐨勫紓姝ヨ涓猴紝鑰屾棤闇€鏁呮剰閾炬帴鎵胯銆侫syncasync瀛楅潰鎰忔€濇槸寮傛鐨勬蹇点€傛寜鐓DN鐨勬蹇碉紝async澹版槑浜嗕竴涓紓姝ユ瀯閫犲嚱鏁般€傜湅涓嬮潰鐨勪緥瀛恈onstfn1=asyncfunctionfn(){return1}console.log(fn1())//Promise{:1}鏍规嵁涓婇潰渚嬪瓙鐨勫唴瀹癸紝琛ㄨ揪寮廰sync澹版槑浜嗕竴涓紓姝ユ瀯閫犲嚱鏁帮紝骞惰皟鐢ㄨ鍑芥暟锛岃繑鍥炵粨鏋滀负Promise瀵硅薄銆傞棶棰樻潵浜嗐€傜湅涓婇潰浠g爜涓殑寮傛鍑芥暟锛岃繑鍥炲€间负1锛屼絾鏄粨鏋滄槸涓€涓狿romise瀵硅薄銆傚埆鎷呭績锛岀瓟妗堝氨鍦ㄨ繖閲屻€傚鏋滃嚱鏁颁腑鐨剅eturn涓嶆槸Promise锛屽垯鐩稿綋浜庣敤Promise.resolve(x)functionfn(){returnPromise.resolve(1);}灏嗗叾鍖呰璧锋潵锛屽皢甯歌鍑芥暟杞崲涓篜romise锛屽苟涓旇繑鍥炲€间篃鏄竴涓狿romise瀵硅薄锛岃繖绉嶆柟寮廰sync鍜孭romise鏈変粈涔堝尯鍒紵涔嶄竴鐪嬫病浠€涔堝尯鍒紝涓嶇敤鐫€鎬ワ紝鍐嶇湅awaitawaitawait鐨勫瓧闈㈡剰鎬濓紝灏辨槸绛夊緟鐨勬剰鎬濓紝閭h繕绛変粈涔堝憿锛焎onstfn1=functionfn(){returnPromise.resolve(1);};asyncfunctionresult(){constr1=awaitfn1();鎺у埗鍙版棩蹇楋紙r1锛夛紱//1}缁撴灉();鍏朵粬鍊硷紵constfn1=functionfn(){returnPromise.resolve(1);};constfn2=functiontest(){return"test";};asyncfunctionresult(){constr1=awaitfn1();constr2=awaitfn2();鎺у埗鍙版棩蹇楋紙r1锛宺2锛夛紱//1'娴嬭瘯'}缁撴灉();缁撴灉锛屼笉鏄痯romise瀵硅薄鐨勫€间篃鍦ㄧ瓑寰呫€俛wait涓嶄粎鐢ㄤ簬绛夊緟Promise瀵硅薄锛屽畠鍙互绛夊緟浠讳綍琛ㄨ揪寮忕殑缁撴灉銆傝€岃繑鍥炲鐞嗙粨鏋滃彧鑳戒娇鐢╝sync鍑芥暟鍐呴儴鐨刟sync/await鍑芥暟銆傛牴鎹笂闈㈢殑鍐呭锛屾垜鏄庣櫧浜哸sync鍜宎wait鏄浣曚娇鐢ㄥ拰杩斿洖缁撴灉鐨勶紝閭d箞瀹冧滑鐨勫姛鑳戒綋鐜板湪鍝噷鍛紵鍏堢湅鐪嬩笅闈㈢殑涓氬姟銆備笟鍔″唴瀹归渶瑕侀噸澶嶈姹傛搷浣滐紝浣嗘槸鎺ュ彛鍙傛暟闇€瑕佷粠涓婁竴娆$殑璇锋眰缁撴灉涓幏鍙栥€傝鎴戜滑鐪嬩竴涓嬬ず渚媐unctiongetFetch(type){setTimeout(()=>{letresult=type+1;returnresult;},1000);}getFetch(a).then((b)=>{getFetch(b).then((c)=>{getFetch(c).then((data)=>{returndata;});});});澶氫釜寮傛鎿嶄綔銆傝繖灏辨槸浼犺涓殑鍥炶皟鍦扮嫳锛熼偅鎬庝箞瑙e喅鍛紵浣跨敤promise鏂规硶瑙e喅functiongetFetch(type){returnnewPromise((resolve,reject)=>{letresult=type+1;resolve(result);});}getFetch(0).then((res)=>{console.log(res);returngetFetch(res);}).then((res)=>{console.log(res);returngetFetch(res);}).then((res)=>{console.log(res);});浣跨敤async/await鏉ヨВ鍐砯unctiongetFetch(type){letresult=type+1;杩斿洖缁撴灉锛泒asyncfunctiongetResult(a){constn1=awaitgetFetch(a);constn2=awaitgetFetch(n1);constn3=awaitgetFetch(n2);.log(n1,n2,n3);}ge缁撴灉锛?锛夛紱杈撳嚭缁撴灉涓嶱romise鏂规涓€鑷达紝浣嗕唬鐮佺湅璧锋潵绠€娲佹槑浜嗐€備娇鐢ㄥ悓姝ユ柟寮忚繘琛屽紓姝ユ搷浣滐紝杈惧埌鎺掗槦鐨勬晥鏋滐紝瑙e喅鍥炶皟鍦扮嫳銆備负浠€涔圙enerator鏄痑sync/await璇硶绯栵紵绯栧憿锛熷湪闃竴宄扮殑ES6鍏ラ棬鏁欑▼涓锛氫粈涔堟槸asyncfunction锛熸€讳箣灏辨槸Generator鍑芥暟鐨勮娉曠硸銆侴enerator鍑芥暟鏄竴涓皝瑁呯殑寮傛浠诲姟锛屾垨鑰呰鏄紓姝ヤ换鍔$殑瀹瑰櫒銆傚湪闇€瑕佹殏鍋滃紓姝ユ搷浣滅殑鍦版柟锛屼娇鐢▂ield璇彞琛ㄧず璋冪敤浜咷enerator鍑芥暟锛岃繑鍥炵殑鏄竴涓寚閽堝璞★紙杩欐槸瀹冨拰鏅€氬嚱鏁扮殑鍖哄埆锛夈€傝皟鐢ㄦ寚閽堝璞$殑next鏂规硶灏嗙Щ鍔ㄥ唴閮ㄦ寚閽堛€俷ext鏂规硶鐨勪綔鐢ㄦ槸鍒嗛樁娈垫墽琛孏enerator鍑芥暟銆傛瘡娆¤皟鐢╪ext鏂规硶鏃讹紝閮戒細杩斿洖涓€涓璞¤〃绀哄綋鍓嶉樁娈电殑淇℃伅锛坴alue灞炴€у拰done灞炴€э級銆倂alue灞炴€ф槸yield璇彞鍚庨潰鐨勮〃杈惧紡鐨勫€硷紝琛ㄧず褰撳墠闃舵鐨勫€硷紱done灞炴€ф槸涓€涓竷灏斿€硷紝琛ㄧずGenerator鍑芥暟鏄惁宸茬粡鎵ц瀹屾瘯锛屽嵆鏄惁鏈変笅涓€闃舵銆備簡瑙g敓鎴愬櫒鐢ㄦ硶function*Generator(){yield"1";yieldPromise.resolve(2);杩斿洖"3";}vargen=Generator();console.log(gen);//杩斿洖涓€涓寚閽堝璞enerator{}璋冪敤涓嬩竴涓柟娉昹etres1=gen.next();console.log(res1);//杩斿洖褰撳墠闃舵鐨勫€納value:'1',done:false}letres2=gen.next();鎺у埗鍙版棩蹇楋紙res2锛夛紱//杩斿洖褰撳墠闃舵鐨勫€納value:Promise{2},done:false}res2.value.then((res)=>{console.log(res);//2});letres3=gen.next();console.log(res3);//{value:'3',done:true}letres4=gen.next();console.log(res4);//{value:undefined,done:true}瀹炵幇瀵筧sync/awaitasync/await鐨勭悊瑙c€傚紓姝ュ嚱鏁扮殑鎵ц缁撴灉杩斿洖涓€涓狿romise銆俛sync鍑芥暟鏄皢Generator鍑芥暟鐨勬槦鍙凤紙*锛夋浛鎹负async锛寉ield鏇挎崲涓篴waitasync/await銆係ugar锛屽畠鐨勬牳蹇冮€昏緫鏄凯浠f墽琛屼笅涓€涓嚱鏁版潵鍒濇瀹炵幇涓€涓繑鍥炰竴涓狿romise浣滀负鎵ц缁撴灉鐨勫嚱鏁癴unctionmuYouAsync(){//杩斿洖涓€涓嚱鏁皉eturnfunction(){//杩斿洖涓€涓猵romisereturnnewPromise((resolve,reject)=>{})}}骞朵笖muYouAsync鎺ュ彈涓€涓狦enerator鍑芥暟浣滀负鍙傛暟锛岄偅涔堟垜浠潵鏀硅繘function*gen(){}//鎺ュ彈涓€涓狦enerator鍑芥暟浣滀负鍙傛暟functionmuYouAsync(gen){//杩斿洖涓€涓嚱鏁皉eturnfunction(){//杩斿洖涓€涓猵romisereturnnewPromise((resolve,reject)=>{})}}璁╂垜浠祴璇曚竴涓嬫槸鍚︽墽琛岀粨鏋滆繑鍥濸romiseconstasyncGen=muYouAsync(gen)console.log(asyncGen())//Promise{}鏌ョ湅杈撳嚭缁撴灉锛屼笌杩斿洖Promise鐨勬墽琛岀粨鏋滀竴鑷淬€傝嚦姝わ紝鍑芥暟鎵ц鐨勭涓€閮ㄥ垎宸茬粡杩斿洖缁撴灉锛屾帴涓嬫潵鎴戜滑鏉ュ畬鍠凣enerator鍑芥暟constgetFetch=(nums)=>newPromise((resolve)=>{setTimeout(()=>{resolve(nums+1);},1000);});function*gen(){letres1=yieldgetFetch(1);璁﹔es2=yieldgetFetch(res1);璁﹔es3=yieldgetFetch(res2);returnres3;}Generator鍑芥暟涔熷啓濂戒簡銆備笅涓€姝ワ紝鎴戜滑瑕佽€冭檻濡備綍璁╁畠鎵ц璧锋潵锛岄渶瑕佷娇鐢℅enerator鏍稿績閫昏緫鏉ヨ凯浠f墽琛屼笅涓€涓嚱鏁般€傞渶瑕佹敞鎰忕殑涓€鐐规槸闇€瑕佽凯浠f墽琛屼笅//鎺ュ彈涓€涓狦enerator鍑芥暟浣滀负鍙傛暟functionmuYouAsync(gen){//杩斿洖涓€涓嚱鏁皉eturnfunction(){//杩斿洖涓€涓猵romisereturnnewPromise((resolve,reject)=>{//鎵ц鐢熸垚鍣ㄥ嚱鏁發etg=gen();constnext=(context)=>{const{done,value}=g.next(context);if(done){//姝ゆ椂琛ㄧず宸茬粡瀹屾垚锛岄渶瑕佽繑鍥炵粨鏋渞esolve(value);}else{//缁х画鎵ц涓嬩竴涓嚱鏁帮紝骞朵紶鍏ユ墽琛岀粨鏋渞eturnPromise.resolve(value).then(val=>next(val))}};涓嬩竴涓紙锛?});};}鏁翠綋閫昏緫宸茬粡琛ュ厖瀹屾瘯锛岄偅涔堟垜浠渶瑕佸畬鎴愭渶鍚庝竴姝ワ紝async杩斿洖涓€涓猵romise锛屾墍浠ユ垜浠彲浠ヤ娇鐢╰rycatch鏉ユ崟鑾峰畬鏁寸殑浠g爜//鎺ュ彈涓€涓狦enerator鍑芥暟浣滀负鍙傛暟functionmuYouAsync(gen){//杩斿洖涓€涓嚱鏁皉eturnfunction(){//杩斿洖涓€涓猵romisereturnnewPromise((resolve,reject)=>{//鎵цGenerator鍑芥暟letg=gen();constnext=(context)=>{letrestry{res=g.next(context);}catch(error){reject(error)}if(res.done){//姝ゆ椂鎻忚堪宸茬粡瀹屾垚锛岄渶瑕佽繑鍥炵粨鏋渞esolve(res.value);}else{//缁х画鎵ц涓嬩竴涓嚱鏁帮紝骞朵紶鍏ユ墽琛岀粨鏋渞eturnPromise.resolve(res.value).then(val=>next(val),err=>next(err))}};涓嬩竴涓紙锛?}锛?};}璁╂垜浠渶鍚庢祴璇曚竴涓媍onstgetFetch=(nums)=>newPromise((resolve)=>{setTimeout(()=>{resolve(nums+1);},1000);});function*gen(){璁﹔es1=yieldgetFetch(1);璁﹔es2=yieldgetFetch(res1);璁﹔es3=yieldgetFetch(res2);returnres3;}constasyncGen=muYouAsync(gen);asyncGen().then(res=>{console.log(res)});//4缁撹杩欎竴骞寸殑蹇冨緱锛屾槸杈撳嚭浜嗕竴浜涙枃绔狅紝骞蹭笉浜嗗嚑骞达紝杩樻槸涓€浜嬫棤鎴愩€傝繖鍑犲ぉ鐪嬩簡寰堝鏂囩珷锛岀湅鍒板钩鍙颁笂鏈夊緢澶氬墠绔伐浣滆€呫€傜◢寰粴涓€涓嬪氨濂戒簡锛岃鏄叞鏂簡灏变笉瑕佹粴浜嗐€傚鏋滆寰楄繖绡囨枃绔犳湁鐐瑰府鍔╋紝娆㈣繋鐐逛釜璧烉煡吼煡吼煡烘杩庡ぇ瀹舵潵澶у搴挀楸硷紝浜ゆ祦瀛︿範锛屼簤褰撴哺鐐圭帇