[问题] 把异步模拟成同步的问题

楼主: 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