作者awpadam (adam!)
看板Web_Design
标题[问题] 把非同步模拟成同步的问题
时间Tue Jun 19 16:48:54 2018
各位好
小弟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/cn.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