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;
修复说明
- 给Promise添加了
resolve()调用,让await能够正常结束等待; - 通过
setTimeout定时检查isAvailable的状态,直到它变为true再执行目标代码; - 添加了
try/catch来捕获可能的错误,这是异步代码的最佳实践之一。
运行这段代码后,你会依次看到test1、test2,随后看到here asyncFunc的输出。
内容的提问来源于stack exchange,提问作者mehmetakkus
相关产品推荐
相关产品推荐

