第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

nodejs實(shí)現(xiàn)異步時遇到的一個問題

nodejs實(shí)現(xiàn)異步時遇到的一個問題

翻翻過去那場雪 2019-05-25 17:59:15
例如有a,b,c三個函數(shù),分別都執(zhí)行同步操作,為了簡化我把同步操作簡化了一下functionc(m){m=m+1;returnm;}functionb(m){m=m+1;returnc(m);}functiona(){letm=0;returnb(m);}執(zhí)行a()輸出的是2但是如果c函數(shù)執(zhí)行的不是同步函數(shù),是異步操作例如functionc(m){setTimeout(function(){m=m+1;},1000)returnm;}執(zhí)行a()時,要想正確輸出2,就得把c通過promise或者async進(jìn)行封裝,類似functionpromiseC(m){returnnewPromise((resolve,reject)=>{setTimeout(function(){m=m+1;resolve(m);},1000)}}asyncfunctionc(m){m=awaitpromiseC(m);returnm;}因?yàn)閏變?yōu)楫惒胶瘮?shù),b要調(diào)用c,b也要改為異步的,如此類推a也得改為異步asyncfunctionb(m){m=m+1;returnawaitc(m);}asyncfunctiona(){letm=0;returnawaitb(m);}a().then(function(data){console.log(data)})這樣才能輸出2為了正確輸出2,我把a(bǔ),b都改變了,不知道有沒有其他方法可以避免改變a,b又能達(dá)到正確輸出呢?由于剛開始寫代碼時沒有考慮到異步的情況,像a,b這些函數(shù)都是分布到不同文件里面,而且數(shù)量比較多,現(xiàn)在為了讓c可以執(zhí)行異步操作,改起來太難了,不知道大家有沒有其他好的方法?下面是新添加的問題利用下面回答中直接返回promise對象的方法可以解決以上的問題,但是實(shí)際代碼更多的結(jié)構(gòu)是這樣的functionc(m){m=m+1;returnm;}functionb(m){m=m+1;letn=c(m)n=n+1returnn;}functiona(){letm=0;letk=b(m);k=k+1;returnk;}如果按這個方法,我得改造a,b的return方法才能讓a,b返回promise對象,對于這樣的結(jié)構(gòu)不知道還有沒有不改動a,b函數(shù)實(shí)現(xiàn)正確輸出的方法
查看完整描述

2 回答

?
繁星淼淼

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個贊

很遺憾的告訴你,node這邊是顯式異步的,所以你把一個函數(shù)從同步改成異步,那么依賴它的函數(shù)也必須做更改,重構(gòu)的時候確實(shí)是個頭疼的事情,你還是忍著改改吧。
像fibjs這種不需要異步關(guān)鍵字的重構(gòu)起來就很省心了,你改了c不需要改動a和b,因?yàn)殡[式異步不需要你指示它。
                            
查看完整回答
反對 回復(fù) 2019-05-25
?
達(dá)令說

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個贊

還是對Promise的理解不到位啊。這里沒必要改動b()和a()的。
對于函數(shù)c,只需要返回一個promise對象,經(jīng)過函數(shù)b的時候,直接同步返回這個Promise對象,不需要改動函數(shù)b使其為異步函數(shù),因?yàn)楫惒讲僮魇窃诤瘮?shù)c中,b中只進(jìn)行了同步操作。此時需要在函數(shù)a中捕獲這個Promise,所以代碼可以改成這樣
functionpromiseC(m){
returnnewPromise((resolve,reject)=>{
setTimeout(function(){
m=m+1;
resolve(m);
},1000)
})
}
functionc(m){
m=promiseC(m);
returnm;
}
functionb(m){
m=m+1;
returnc(m);
}
functiona(){
letm=0;
returnb(m);
}
p.then(function(a){
console.log(a)
})
所以,這里函數(shù)a(),b()如果不處理異步操作的返回值,那為何要把他改成Async函數(shù)呢。
                            
查看完整回答
反對 回復(fù) 2019-05-25
  • 2 回答
  • 0 關(guān)注
  • 602 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號