色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:76日期:2023-08-26 17:07:45

問題描述

例如有a,b,c三個(gè)函數(shù),分別都執(zhí)行同步操作,為了簡(jiǎn)化我把同步操作簡(jiǎn)化了一下

function c(m) { m = m + 1; return m;}function b(m) { m = m + 1; return c(m);}function a(){ let m = 0; return b(m);}

執(zhí)行 a() 輸出的是2但是如果c函數(shù)執(zhí)行的不是同步函數(shù),是異步操作例如

function c(m) { setTimeout(function () {m = m + 1; }, 1000) return m;}

執(zhí)行a()時(shí),要想正確輸出2,就得把c通過promise或者async進(jìn)行封裝,類似

function promiseC(m) { return new Promise((resolve, reject) => {setTimeout(function () {m = m + 1;resolve(m);}, 1000) }}async function c(m) { m = await promiseC(m); return m; }

因?yàn)閏變?yōu)楫惒胶瘮?shù),b要調(diào)用c,b也要改為異步的,如此類推a也得改為異步

async function b(m) { m = m + 1; return await c(m);}async function a(){ let m = 0; return await b(m);}

a().then(function(data) {

console.log(data)

})這樣才能輸出2

為了正確輸出2,我把a(bǔ),b都改變了,不知道有沒有其他方法可以避免改變a,b又能達(dá)到正確輸出呢?由于剛開始寫代碼時(shí)沒有考慮到異步的情況,像a,b這些函數(shù)都是分布到不同文件里面,而且數(shù)量比較多,現(xiàn)在為了讓c可以執(zhí)行異步操作,改起來(lái)太難了,不知道大家有沒有其他好的方法?

下面是新添加的問題利用下面回答中直接返回promise對(duì)象的方法可以解決以上的問題,但是實(shí)際代碼更多的結(jié)構(gòu)是這樣的

function c(m) { m = m + 1; return m;}function b(m) { m = m + 1; let n = c(m) n = n + 1 return n;}function a(){ let m = 0; let k = b(m); k = k + 1; return k;}

如果按這個(gè)方法,我得改造a,b的return方法才能讓a,b返回promise對(duì)象,對(duì)于這樣的結(jié)構(gòu)不知道還有沒有不改動(dòng)a,b函數(shù)實(shí)現(xiàn)正確輸出的方法

問題解答

回答1:

很遺憾的告訴你,node這邊是顯式異步的,所以你把一個(gè)函數(shù)從同步改成異步,那么依賴它的函數(shù)也必須做更改,重構(gòu)的時(shí)候確實(shí)是個(gè)頭疼的事情,你還是忍著改改吧。

像fibjs這種不需要異步關(guān)鍵字的重構(gòu)起來(lái)就很省心了,你改了c不需要改動(dòng)a和b,因?yàn)殡[式異步不需要你指示它。

回答2:

還是對(duì)Promise的理解不到位啊。這里沒必要改動(dòng)b()和a()的。

對(duì)于函數(shù)c,只需要返回一個(gè)promise對(duì)象,經(jīng)過函數(shù)b的時(shí)候,直接同步返回這個(gè)Promise對(duì)象,不需要改動(dòng)函數(shù)b使其為異步函數(shù),因?yàn)楫惒讲僮魇窃诤瘮?shù)c中,b中只進(jìn)行了同步操作。此時(shí)需要在函數(shù)a中捕獲這個(gè)Promise,所以代碼可以改成這樣

function promiseC(m) { return new Promise((resolve, reject) => {setTimeout(function () { m = m + 1; resolve(m);}, 1000) })}function c(m) { m = promiseC(m); return m;}function b(m) { m = m + 1; return c(m);}function a() { let m = 0; return b(m);}p.then(function(a){ console.log(a)})

所以,這里函數(shù)a(),b()如果不處理異步操作的返回值,那為何要把他改成Async函數(shù)呢。

回答3:

可以試試 http://fibjs.org/docs/manual/... 直接轉(zhuǎn)成同步即可

回答4:

不得不說(shuō)我盯著屏幕打了好些草稿, 最終還是失敗了.

我想不出有什么方法能在 js 里阻塞當(dāng)前函數(shù)但是又能及時(shí)執(zhí)行 promise 的 resolve. 失敗的思路如下

c_result=nullc=async (m)=>{return m+1}c_sync = (m)=>{ let n=0pc=c(m).then((m)=>{c_result=m}) while(c_result===null && n++<100){} return c_result}b=(m)=>{return c_sync(m+1)}a=()=>{return b(0)}a()

它的問題在于, 雖然while(c_result===null && n++<100){}阻塞了函數(shù)c_sync, 但是也阻止了.then回調(diào)的執(zhí)行. 由于單線程異步的機(jī)制, 當(dāng)某一個(gè)回調(diào)觸發(fā)的時(shí)候, 如果線程正忙, 這個(gè)回調(diào)是沒法插隊(duì)的, 從而導(dǎo)致循環(huán)執(zhí)行過程中, c_result沒辦法被變量 m 賦值.也就沒辦法退出循環(huán).

但是我覺得這個(gè)問題很有意思. 找到了一篇相關(guān)文章. 作者通過一個(gè)外部二進(jìn)制庫(kù)結(jié)局了局部阻塞的問題.

http://blog.csdn.net/xingqili...

我的理解是:基于 js 引擎自身的事件循環(huán), 我們不能阻塞某個(gè)塊. 因?yàn)閷?duì)于 js 代碼而言引擎的事件循環(huán)是在底層. 但是對(duì)于外部的二進(jìn)制模塊而言. 其可以阻塞自身, 并保證 js 引擎的事件循環(huán)每一次都完全遍歷事件隊(duì)列----以保證自身阻塞期間在 js 引擎中新增的事件能被處理.

回答5:

讓a()輸出promise,確實(shí)可以解決我提到的問題但是在真正修改代碼的時(shí)候,我發(fā)現(xiàn)大部分代碼的結(jié)構(gòu)不是我上面問題這樣的而是下面新補(bǔ)充的結(jié)構(gòu)

function c(m) { m = m + 1; return m;}function b(m) { m = m + 1; let n = c(m) n = n + 1 return n;}function a(){ let m = 0; let k = b(m); k = k + 1; return k;}回答6:

恕我直言,你沒有對(duì) node.js 的事件循環(huán)機(jī)制和 event 核心模塊作深入的了解。promise 和 aysnc/await 確實(shí)是如今處理異步流程控制的主流,但并不是說(shuō)沒有了它們就做不了了,這種簡(jiǎn)單的問題回溯到 event 方式處理即可。

const EventEmitter = require(’events’);class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();myEmitter.on(’a’, (m) => { console.log(’a -> b’); myEmitter.emit(’b’, m+1);});myEmitter.on(’b’, (m) => { console.log(’b -> c’); myEmitter.emit(’c’, m+1);});myEmitter.on(’c’, (m) => { console.log(’result’, m);});myEmitter.emit(’a’, 0);

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 99久久综合给久久精品 | 成人看的一级毛片 | 美女被免费视频网站a国产 美女被免费网站视频软件 美女被免费网站在线软件 美女被免费网站在线视频软件 | 精品一区二区三区视频在线观看免 | 国产情侣自拍网站 | 免费一级大片 | 免费观看欧美精品成人毛片能看的 | 50岁老女人毛片一级亚洲 | 亚洲精品天堂在线观看 | 中国黄色网址大全 | 色综合天天综合网看在线影院 | 精品视自拍视频在线观看 | 一区二区三区视频免费观看 | 特级av毛片免费观看 | 淫模| 久久国产欧美另类久久久 | 久草视频资源 | 欧美人成在线观看ccc36 | 国产亚洲欧洲精品 | 香蕉视频黄在线观看 | 国产亚洲精品看片在线观看 | 欧美手机在线视频 | 国产视频二 | 18在线观看国内精品视频 | 欧美午夜精品久久久久久黑人 | 黑人边吃奶边扎下面激情视频 | 理论片我不卡在线观看 | 美国黑人特大一级毛片 | 一本一本久久a久久精品综合麻豆 | 性欧美一级毛片 | 毛片在线播放网址 | 久久久精品久久视频只有精品 | 精品国产日韩亚洲一区二区 | 日韩免费毛片全部不收费 | 最新日韩欧美不卡一二三区 | 色黄在线 | 中文字幕有码在线观看 | 玖玖玖精品视频免费播放 | 日韩欧美一区二区三区在线观看 | 亚洲精品国产三级在线观看 | 免费看欧美日韩一区二区三区 |