Angular WebWorker中sleep无延迟及NodeJS传递轮询配置问题咨询
问题1:sleep函数未按预期生效的原因
你的sleep函数返回的是Promise对象,属于异步函数,你当前代码中调用sleep(30000)时没有添加await关键字,JS执行引擎不会等待该Promise执行完成,就会直接运行下一行的getAsyncFilesResult逻辑,相当于sleep的延迟逻辑完全没有阻塞当前循环流程,所以看不到延迟效果。
修复方案很简单,只需在调用sleep前增加await关键字即可,WebWorker环境完全支持async/await语法,不会阻塞同线程其他正常逻辑运行,修复后的代码如下:
while (jobIsStillRunning(jobExecutionResult)) { postMessageWithLog(jobExecutionResult); log('DEBUG','sendFilePolling() jobExecutionResult=' + JSON.stringify(jobExecutionResult)); await sleep(30000); // 新增await等待延迟执行完成 jobExecutionResult = await getAsyncFilesResult(jobExecutionResult); }
问题2:轮询延迟配置下发方案
cookie方案可行性
可行,但不推荐,存在以下弊端:
- 所有前端发起的同域请求都会自动携带cookie,会增加不必要的请求体积,该配置仅需在应用初始化时获取一次,完全不需要每次请求都传输
- 存在跨域限制,若NodeJS服务和Angular应用域名跨域,需要额外配置跨域凭证规则,增加运维成本
- cookie存储大小有限,后续新增配置项时扩展性差
最优实现方案
根据场景选择以下两种方案即可:
- 优先级最高:初始化接口拉取。利用Angular的
APP_INITIALIZER初始化钩子,在应用启动时主动调用NodeJS提供的全局配置拉取接口,将轮询延迟等配置存在前端全局服务或者localStorage中,后续轮询逻辑直接读取该值即可。该方案解耦性最高,服务端修改配置后不需要重新打包前端代码,配置实时生效。 - 次优方案:HTML模板注入。NodeJS服务返回Angular应用的index.html时,直接将配置参数通过script标签注入到window全局对象上,比如插入
<script>window.APP_CONFIG = { pollDelay: 30000 }</script>,前端直接读取window.APP_CONFIG.pollDelay即可,不需要额外发起接口请求,适合配置项固定、不需要动态更新的场景。
内容的提问来源于stack exchange,提问作者Woodsman
相关产品推荐
相关产品推荐

