Web_Design 板


LINE

各位好 小弟js寫沒多久,目前碰到一個難題,希望大家不吝指教 是這樣的,目前我們的js有個常用的function原本是 同步的 現在因為某些原因變成非同步的 舉例如下 假設這個常用的function是這樣 function getService(){ // 同步敘述 跟底層的c api 取得一些資源,並回傳回來 result = c_api(); return result ; } 而現在底層的c api 做了一些大改版,導致變成非同步的模式 類似變成 function getService( callback ){ // 非同步 要把callback帶給底層的c api ,底層c api 取得資源後,會把資料 用 格式帶給callback c_api( callback ); } 我們原本流程的code可能長這樣 xxxx var service = getService() //對service的接續流程 現在卻要改寫成 function get_json( json ){ var service = parse_json_value( json ); //對service的接續流程 } xxxx getService( get_json ) ; 由於我們很多地方都用到getService這個function 如果全都改寫成callback的方式會花大量的時間 所以主管就說找找看有沒有什麼可以在js這邊把非同步模擬成同步的方法 (底層 c 貌似 已經無法弄成同步的了) 這樣轉一層之後,原本的流程架構就可以不用改 我google找到 promise 這個語法,不過初步看起來,他是用來處理許多非同步和非同步 流程 的方法 (避免非同步的callback地獄) 好像不是像我需要的 在同步和非同步之間,直接把非同步模擬成同步的 請問像我需要的這種功能,應該從什麼方向著手呢? 我好像敘述的有點亂,如果看不懂的話我可以再補充,先謝謝各位大大了 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.7.85
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Web_Design/M.1529398136.A.1A9.html
1F:推 eight0: 環境是 Node.js 的話可以試試 child_process.execSync06/19 18:53
是在瀏覽器下的純js喔 ※ 編輯: awpadam (223.140.179.151), 06/19/2018 18:59:49
2F:推 Kenqr: await?06/19 19:00
因為用特殊瀏覽器的關係,我們的環境只支援ES6,沒有支援await ※ 編輯: awpadam (223.140.179.151), 06/19/2018 19:06:52
3F:推 sa0124: 哇 這個好難 用settimeout把同步包裝成非同步 讓下一個非06/19 19:07
4F:→ sa0124: 同步接參數呢? 06/19 19:07
5F:→ sa0124: (這做法很爛 看有沒有更好的做法)06/19 19:07
其實我主管的訴求就是:把 //對service的接續流程 這個部分包成函式太麻煩了,因為裡面有各式各樣的code 也有非同步的code 所以才想說把getService 這個函式想辦法模擬成同步的,是最好的辦法 所以你的辦法可能對我就不適用了~ ※ 編輯: awpadam (123.193.141.167), 06/19/2018 19:46:21
6F:推 davidsky: 用await 然後用babel編譯成ES6/5, 不過這樣還是得改code06/19 20:16
請問這樣的話,我們的瀏覽器不支援await,還是會work嗎?它會自己用對應的語法嗎? ※ 編輯: awpadam (123.193.141.167), 06/19/2018 20:33:41
7F:推 mmis1000: babel 最低能 target es3,await什麼的會幫你全轉掉06/19 21:22
8F:推 shter: 用 while 等到有值會報無限迴圈當掉嗎?06/19 21:51
主管是有提過可不可以用無限迴圈模擬,但是我覺得這樣好像很吃資源,所以上來問版友 ※ 編輯: awpadam (123.193.141.167), 06/19/2018 22:01:24
9F:推 mmis1000: 在js用dead loop等值,你等到往生都等不到 06/19 22:01
好像是欸,因為是單執行緒的,會卡死在while ※ 編輯: awpadam (123.193.141.167), 06/19/2018 22:02:58
10F:→ mmis1000: 基於 Event Loop 的語言,你用 dead loop 就是自殺 06/19 22:02
11F:推 sa0124: 哦哦 懂你意思了 那就是用await了 但我印象中我只裝babel06/19 23:26
12F:→ sa0124: 好像沒跑成功,還要再裝額外的polyfill才行06/19 23:26
13F:→ superpai: 就算用了 await,你還是要在該加async的地方加async06/20 05:28
14F:→ superpai: 你逃不了改寫的。 06/20 05:28
有點慘,謝謝大家提供的意見,謝謝 ※ 編輯: awpadam (223.140.44.185), 06/20/2018 08:34:09
15F:推 steven11329: es6 generator 06/23 14:40
16F:→ steven11329: https://github.com/tj/co 給你參考 06/23 14:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP