await前缀工作原理及fetch中await未生效致变量未初始化问题求助
await的工作原理
- await 仅能在
async标记的函数内部使用,它会暂停当前async函数的执行,等待右侧Promise对象完成状态变更(变为resolved),拿到Promise的结果后,才会继续执行async函数中await之后的代码。 - 核心注意点:
async函数被调用时,会立刻返回一个Promise,不会阻塞函数外部的同步代码。await的“暂停”效果只局限在当前async函数内部,对函数外的代码没有阻塞作用。
你的代码问题分析
你直接调用resetForumData()后,后续代码会同步执行,但resetForumData是async函数,内部的await只会暂停自身执行,不会阻止外部代码运行。这就导致你依赖message和names的代码会在这两个变量被赋值前就执行,看起来像是“await没生效”。
比如你如果在调用后直接写:
resetForumData(); console.log(message); // 此时message仍是undefined,因为resetForumData里的fetch请求还没完成
解决方法
要确保在message和names初始化完成后再执行依赖代码,有两种常用方式:
- 将后续代码放在async函数中,通过await等待resetForumData完成
async function initApp() { await resetForumData(); // 这里写所有依赖message、names的代码 console.log(message[0]); } initApp();
- 利用resetForumData返回的Promise,通过.then()处理后续逻辑
resetForumData().then(() => { // 此处message和names已完成初始化 console.log(message[0]); });
另外,你的getArraysFromPHP函数可以改用await重构,可读性更强:
async function getArraysFromPHP(phpFile) { const response = await fetch('forumData.php'); const data = await response.json(); return [data.data, data.data1]; }
内容的提问来源于stack exchange,提问作者Mother Thief
相关产品推荐
相关产品推荐

