概述
C++
写的一个异步分析接口,会不断通过回调发送electron
当前的分析数据- 但是,在某个场景(
js
)需要调用这个接口,还需要调用后拿到最终的分析结果后再处理其他逻辑
节流实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** * 节流函数,异步,支持返回值 * @param {Function} func 原函数 * @param {number} wait 时间 * @returns 返回节流函数 */ function throttle(func, wait) { let previous = 0; let ret = undefined; return async function () { let now = +new Date(); let context = this; if (now - previous >= wait) { ret = await func.apply(context, arguments); previous = now; } return ret; } } |
等待异步操作
- 函数返回
- 这里是用的
Promise
对操作进行了封装,只有调用resolve
的时候才返回
- 这里是用的
- 异步
- 比如下面的
ScanAll
是一个异步操作,当整个操作完成后,将触发onEngineStop
事件 - 所以这里在执行这个异步操作之前,先在
onEngineStop
这个事件上注册了一个回调函数onEngineStoped
- 当
ScanAll
完成工作后,最后会调用这个onEngineStoped
,获取扫描的结果后,就可以通过resolve
返回了
- 比如下面的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
GetTrashScanRes = throttle(async () => { return new Promise(resolve => { const onEngineStoped = () => { let totalSize = app.cleanengineutils.GetAllTotalSize(false); let totalCount = app.cleanengineutils.GetTotalTraceCnt(); app.cleanengineutils.onEngineStop.removeEventListener(onEngineStoped); console.log("CTrashOwnPopControler count:" + totalCount + " size:" + totalSize); resolve({ count: totalCount, size: totalSize }); }; if (!app.cleanengineutils.IsEngineStop.promise()) { console.log("CTrashOwnPopControler count:0 size:0"); resolve({count: 0, size: 0}); } app.cleanengineutils.onEngineStop.addEventListener(onEngineStoped); app.cleanengineutils.RestoreToDefault("{\"category_id\":\"C1\"}"); app.cleanengineutils.RestoreToDefault("{\"category_id\":\"C2\"}"); app.cleanengineutils.ScanAll(); }); } , 10 * 60 * 1000); |
- 其他情况
- 比如下面的事件
onAnalyzeProgress
并不是发一次,而是每完成一定进度就会触发一次 - 通用用这种方式让它阻塞在这里,最后等到
progress
为100
的时候返回
- 比如下面的事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
GetFragScanRes = throttle(async () => { return new Promise(resolve => { const AnalyzeProgress = (res) => { console.log("cb: analyze process , " + res); let data = JSON.parse(res); if (data) { console.log("cb: analyze process , " + data.progress); } if (data && data.progress === 100) { app.disk_defrag.onAnalyzeProgress.removeEventListener(AnalyzeProgress); let a_res = data.analyse_result; resolve({count: a_res.fragment_count, size: a_res.fragment_file_size, ratio: a_res.fragment_ratio}); } }; app.disk_defrag.onAnalyzeProgress.addEventListener(AnalyzeProgress); let disk = app.disk_defrag.getSystemDisk(); console.log("cb: analyze GetFragScanRes , " + disk) app.disk_defrag.startAnalyse(disk); }); }, 1 * 60 * 60 * 1000); |
声明:本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!