You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 20:18:03