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

JavaScript异步函数代码问题:为何仅输出test1和test2?

你的异步函数代码问题分析与修复

嘿,我来帮你拆解这段代码的问题,以及怎么修正它~

核心问题点

  • Promise从未被决议
    你在asynchFunc里创建了Promise,但完全没有调用resolve()或reject()方法。await关键字会一直等待这个Promise完成,而因为Promise永远不会被决议,后续相关逻辑永远不会触发。而且Promise的执行器(executor)函数是同步执行的——在你调用asynchFunc()的瞬间,它就会执行里面的判断逻辑,之后就算修改isAvailable的值,也不会重新执行这段判断。

  • isAvailable的赋值时机错误
    你是在调用异步函数、打印test2之后才把isAvailable设为true,但此时Promise的执行器已经跑完了(当时isAvailable还是初始的false),所以console.log('here asyncFunc')根本不会被触发。

修复后的代码示例

如果你的需求是等待isAvailable变为true后执行console.log('here asyncFunc'),可以这样修改:

let isAvailable = false;
console.log('test1');

// 修正后的异步函数:定时检查isAvailable状态
let asynchFunc = () => {
  return new Promise((resolve) => {
    const checkStatus = () => {
      if (isAvailable === true) {
        console.log('here asyncFunc');
        resolve(); // 调用resolve让await结束等待
      } else {
        // 每隔100ms检查一次状态
        setTimeout(checkStatus, 100);
      }
    };
    checkStatus();
  });
};

// 立即执行异步函数,同时添加错误捕获
(async () => {
  try {
    await asynchFunc();
  } catch (err) {
    console.error(err);
  }
})();

console.log('test2');
isAvailable = true;

修复说明

  1. 给Promise添加了resolve()调用,让await能够正常结束等待;
  2. 通过setTimeout定时检查isAvailable的状态,直到它变为true再执行目标代码;
  3. 添加了try/catch来捕获可能的错误,这是异步代码的最佳实践之一。

运行这段代码后,你会依次看到test1、test2,随后看到here asyncFunc的输出。

内容的提问来源于stack exchange,提问作者mehmetakkus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:05