日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

javascript - nodejs實現異步時遇到的一個問題

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

問題描述

例如有a,b,c三個函數,分別都執行同步操作,為了簡化我把同步操作簡化了一下

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);}

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

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

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

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; }

因為c變為異步函數,b要調用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都改變了,不知道有沒有其他方法可以避免改變a,b又能達到正確輸出呢?由于剛開始寫代碼時沒有考慮到異步的情況,像a,b這些函數都是分布到不同文件里面,而且數量比較多,現在為了讓c可以執行異步操作,改起來太難了,不知道大家有沒有其他好的方法?

下面是新添加的問題利用下面回答中直接返回promise對象的方法可以解決以上的問題,但是實際代碼更多的結構是這樣的

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;}

如果按這個方法,我得改造a,b的return方法才能讓a,b返回promise對象,對于這樣的結構不知道還有沒有不改動a,b函數實現正確輸出的方法

問題解答

回答1:

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

像fibjs這種不需要異步關鍵字的重構起來就很省心了,你改了c不需要改動a和b,因為隱式異步不需要你指示它。

回答2:

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

對于函數c,只需要返回一個promise對象,經過函數b的時候,直接同步返回這個Promise對象,不需要改動函數b使其為異步函數,因為異步操作是在函數c中,b中只進行了同步操作。此時需要在函數a中捕獲這個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)})

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

回答3:

可以試試 http://fibjs.org/docs/manual/... 直接轉成同步即可

回答4:

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

我想不出有什么方法能在 js 里阻塞當前函數但是又能及時執行 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){}阻塞了函數c_sync, 但是也阻止了.then回調的執行. 由于單線程異步的機制, 當某一個回調觸發的時候, 如果線程正忙, 這個回調是沒法插隊的, 從而導致循環執行過程中, c_result沒辦法被變量 m 賦值.也就沒辦法退出循環.

但是我覺得這個問題很有意思. 找到了一篇相關文章. 作者通過一個外部二進制庫結局了局部阻塞的問題.

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

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

回答5:

讓a()輸出promise,確實可以解決我提到的問題但是在真正修改代碼的時候,我發現大部分代碼的結構不是我上面問題這樣的而是下面新補充的結構

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:

恕我直言,你沒有對 node.js 的事件循環機制和 event 核心模塊作深入的了解。promise 和 aysnc/await 確實是如今處理異步流程控制的主流,但并不是說沒有了它們就做不了了,這種簡單的問題回溯到 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);

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产福利亚洲| 福利一区二区三区视频在线观看| 亚洲色图网站| 高清av不卡| 蜜桃av一区二区| 日产精品一区| 国产精品密蕾丝视频下载| 红桃视频欧美| 亚洲成人二区| 天堂а√在线最新版中文在线| 日本不卡视频在线| 亚洲精品小说| 国产一区二区三区自拍| 三级小说欧洲区亚洲区| 在线精品亚洲欧美日韩国产| 国产精品久久久久毛片大屁完整版| av成人国产| 亚洲精品一二三区区别| 国产91精品对白在线播放| 免费福利视频一区二区三区| 美女网站一区| 日本va欧美va欧美va精品| 精品高清久久| 首页国产欧美久久| 久久91视频| 蜜臀精品久久久久久蜜臀| 国产精品nxnn| 老鸭窝亚洲一区二区三区| 国产精品一站二站| 亚洲特级毛片| 久久精品国产99国产精品| 99精品综合| 欧美日韩1区2区3区| 国产一区久久| 国产一区二区三区亚洲| 一区二区国产在线观看| 日韩激情一区| 国产精品2023| 首页国产欧美日韩丝袜| 亚洲黄色网址| 欧美激情久久久久久久久久久| 丝袜亚洲精品中文字幕一区| 91亚洲人成网污www| 国产欧美日韩一区二区三区四区 | 91综合视频| 国产精品主播| 亚洲精品在线a| 影音国产精品| 999精品色在线播放| 精品一区二区三区视频在线播放 | 麻豆精品一区二区综合av| 婷婷综合社区| 麻豆高清免费国产一区| 亚洲精选久久| 免费欧美在线视频| 香蕉国产精品| 亚州av乱码久久精品蜜桃| 黑森林国产精品av| 麻豆精品在线观看| 国产精选一区| 国产精品夜夜夜| 国产精品久久久久9999高清| 日本亚洲欧美天堂免费| 亚洲网址在线观看| 中文字幕av一区二区三区四区| 午夜欧美精品久久久久久久| 日韩精品首页| 亚洲福利国产| 午夜精品一区二区三区国产| 日韩午夜一区| 日韩和欧美一区二区三区| 亚洲v天堂v手机在线| 97精品久久| 岛国精品一区| 久久视频一区| 日韩一区二区三区精品视频第3页| 国产欧美自拍一区| av日韩中文| 日本大胆欧美人术艺术动态| 日本成人中文字幕| 精品一区二区三区在线观看视频| 免费看av不卡| 欧美99久久| 91p九色成人| 久久久久久久久丰满| 亚洲综合电影一区二区三区| 日本三级亚洲精品| 成人福利av| 中文字幕成人| 三级精品视频| 亚洲九九精品| 日韩成人三级| 日韩在线网址| 91精品啪在线观看国产18| 日本三级亚洲精品| 久久精品动漫| 国产精选久久| 91精品综合| 国产亚洲高清一区| 精品1区2区3区4区| 精品国产黄a∨片高清在线| 午夜在线精品| 成人日韩在线观看| 国产精品第十页| 中文字幕亚洲精品乱码| 欧美日韩视频网站| 国产精品对白| 亚州av日韩av| 伊人成人在线视频| 精品一区91| 国产欧美日韩影院| 亚洲精品动态| 久久久五月天| 日韩中文在线电影| 国模精品一区| 美女久久久久久| 日韩精品导航| 中文无码日韩欧| 亚洲精品91| 亚洲免费精品| 夜夜嗨网站十八久久| 婷婷亚洲综合| 不卡在线一区| 黄色精品网站| 久久高清国产| 国产精品社区| 免播放器亚洲| 亚洲国产综合在线看不卡| 在线看片福利| 日本午夜大片a在线观看| 精品视频黄色| 亚洲精品**中文毛片| 日韩毛片视频| 欧美日韩在线播放视频| 久久国产日韩| 日韩午夜高潮| 热久久免费视频| 亚洲少妇诱惑| 免费在线成人网| 亚洲影视一区| 国产乱论精品| 中文另类视频| 99在线精品免费视频九九视| 亚洲日产国产精品| 国产精品视频一区二区三区综合| 国产96在线亚洲| 婷婷丁香综合| 国产亚洲精品美女久久久久久久久久| 欧美日韩精品一区二区三区在线观看| 欧美极品中文字幕| 亚洲成人一区在线观看| 久久午夜影视| 国产激情久久| 欧美亚洲国产激情| 日本麻豆一区二区三区视频| 精品一区二区三区中文字幕在线| 亚洲第一精品影视| 视频一区二区中文字幕| 久久影视三级福利片| 亚洲精品99| 久久99精品久久久久久园产越南 | 欧美xxxx中国| 另类亚洲自拍| yellow在线观看网址| 亚洲视频二区| 欧美成人基地| 久久av超碰| 亚洲一区二区三区高清不卡| 国产亚洲一区| 免费视频最近日韩| av高清一区| 国产精品18| 亚洲精品护士| 自拍日韩欧美| 成人免费电影网址| 久久精品国产久精国产爱| 中文字幕日本一区| 亚洲精品国产偷自在线观看| 国产成人精品999在线观看| 日韩av中文字幕一区二区三区| 亚洲免费播放| 91久久亚洲| 久久精品播放| 都市激情国产精品| 精品国产乱码久久久| 欧美a级一区二区| 国产精品亚洲人成在99www| 午夜性色一区二区三区免费视频| 婷婷综合亚洲| 91精品99| 好吊视频一区二区三区四区| 色综合www| 特黄特色欧美大片| 欧美成a人免费观看久久| 精品视频在线一区二区在线| 国产女人18毛片水真多18精品| 日韩免费精品| 日本亚洲最大的色成网站www | 国产午夜精品一区二区三区欧美| 在线日韩av|