Node.js中如何在异步函数外部访问await赋值的变量?
Node.js异步函数外部获取内部await变量的解决方案
问题描述
在Node.js中,希望在异步函数外部访问其内部通过await调用函数所赋值的变量,现有代码如下:
getdata 函数
async function getdata() { try { const configData = await redis.getAsync("configdata"); const strifieddata = JSON.parse(configData); return [strifieddata]; } catch (err) { console.log("Error in data", err); } }
获取configdata的函数
const {getbyconfigid,getdata}=require('./middlewareNew/configHelpers') const getconfigdata=async()=>{ storeddata=await getdata() } getconfigdata(); console.log(storeddata)
目前在不使用await的场景下可通过传递内部变量的方式访问值,但使用异步函数时无法获取该变量的值,需要解决这个问题。
解决方案
问题核心是:异步函数getconfigdata()调用后会立即执行后续同步代码console.log(storeddata),此时异步操作还未完成,storeddata尚未被赋值。以下是几种可行解决方式:
方式一:使用then链式调用处理异步结果
直接通过getdata()返回的Promise对象的then方法获取结果,确保在异步操作完成后再执行后续逻辑:
const { getbyconfigid, getdata } = require('./middlewareNew/configHelpers') getdata().then(storeddata => { console.log(storeddata); // 所有依赖该数据的逻辑都放在这个回调内 });
方式二:用立即执行异步函数(IIFE)包裹,使用await等待结果
通过IIFE创建异步上下文,在内部用await等待异步操作完成后再执行后续逻辑:
const { getbyconfigid, getdata } = require('./middlewareNew/configHelpers') (async () => { const storeddata = await getdata(); console.log(storeddata); // 所有需要使用storeddata的代码都写在这里 })();
方式三:修改函数返回结果,使用顶层await(需环境支持)
让getconfigdata返回异步操作的结果,然后在顶层使用await等待结果(注意:CommonJS环境下需将文件改为.mjs格式,或在package.json中设置"type": "module"):
const { getbyconfigid, getdata } = require('./middlewareNew/configHelpers') const getconfigdata = async () => { return await getdata(); // 返回异步操作的结果 } // 顶层await获取结果 const storeddata = await getconfigdata(); console.log(storeddata);
额外注意事项
- 禁止使用未声明的全局变量
storeddata,必须用const或let声明变量,避免全局作用域污染 - 异步操作的结果只能在异步上下文(
await之后、then/catch回调内)中可靠获取,同步代码无法直接拿到未完成的异步操作结果
内容的提问来源于stack exchange,提问作者Sundar Anbu
相关产品推荐
相关产品推荐

