基于setTimeout实现Non-Blocking Function的功能异常问题排查
问题根因
你遇到的两个问题核心原因有两个:
- 自定义Promise未调用
resolve回调:new Promise()构造器如果不执行传入的resolve方法,await该Promise时要么永久挂起,要么无法捕获后续异步任务的完成状态。 - 递归逻辑未透传完成状态:你在setTimeout中执行的递归调用没有和外层Promise绑定,第一次执行codeBlock检测到变量未定义后,当前async函数就直接返回,导致外层
await checkInputCoinStatus()提前结束,不会等待后续的递归检查逻辑。
解决方案
方案1:轮询循环写法(推荐,逻辑简单易维护)
你注释掉的while循环本身逻辑完全可用,直接取消注释即可:
async checkInputCoinStatus() { while (true) { if (this.selectedCoin) { break; } await new Promise((r) => setTimeout(r, 1)); } }
该写法完全满足非阻塞要求:await setTimeout时会让出线程给其他任务执行,不会卡住事件循环,同时会一直等到this.selectedCoin完成赋值后才会退出函数,外层await可以准确等待整个流程执行完成。
方案2:递归写法调整
如果要使用递归实现,需要将每一层的递归结果和Promise绑定:
async checkInputCoinStatus() { const getSelectedCoin = () => this.selectedCoin; const codeBlock = () => new Promise((resolve) => { const selectedCoin = getSelectedCoin(); if (selectedCoin) { return resolve(selectedCoin); } // 延迟检查,递归完成后再resolve当前Promise setTimeout(async () => { const result = await codeBlock(); resolve(result); }, 1); }); await codeBlock(); }
内容的提问来源于stack exchange,提问作者Yomi
相关产品推荐
相关产品推荐

