[問題] 把非同步模擬成同步的問題

作者: awpadam (adam!)   2018-06-19 16:48:54
各位好
小弟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地獄)
好像不是像我需要的 在同步和非同步之間,直接把非同步模擬成同步的
請問像我需要的這種功能,應該從什麼方向著手呢?
我好像敘述的有點亂,如果看不懂的話我可以再補充,先謝謝各位大大了
作者: eight0 (欸XD)   2018-06-19 18:53:00
環境是 Node.js 的話可以試試 child_process.execSync
作者: Kenqr (function(){})()   2018-06-19 19:00:00
await?
作者: sa0124 ((恩恩))   2018-06-19 19:07:00
哇 這個好難 用settimeout把同步包裝成非同步 讓下一個非同步接參數呢?(這做法很爛 看有沒有更好的做法)
作者: davidsky (Alive)   2018-06-19 20:16:00
用await 然後用babel編譯成ES6/5, 不過這樣還是得改code
作者: mmis1000 (秋月戀楓)   2018-06-19 21:22:00
babel 最低能 target es3,await什麼的會幫你全轉掉
作者: shter (飛梭之影)   2018-06-19 21:51:00
用 while 等到有值會報無限迴圈當掉嗎?
作者: mmis1000 (秋月戀楓)   2018-06-19 22:01:00
在js用dead loop等值,你等到往生都等不到基於 Event Loop 的語言,你用 dead loop 就是自殺
作者: sa0124 ((恩恩))   2018-06-19 23:26:00
哦哦 懂你意思了 那就是用await了 但我印象中我只裝babel好像沒跑成功,還要再裝額外的polyfill才行
作者: superpai (超級白)   2018-06-20 05:28:00
就算用了 await,你還是要在該加async的地方加async你逃不了改寫的。
作者: steven11329 (清新柳橙)   2018-06-23 14:40:00
es6 generatorhttps://github.com/tj/co 給你參考

Links booklink

Contact Us: admin [ a t ] ucptt.com