如何在NPM异步函数外部获取变量值?Node.js异步回调问题
回调函数变量无法传递到外部的解决方案
问题分析
你的代码中,binance.balance是异步回调方法,回调函数内的代码会在后续事件循环中执行,但你在同步代码里直接尝试赋值balance = data并返回,此时data还未被回调赋值,自然得到undefined。同时getBalance声明为async但未正确处理异步逻辑,外部调用方式也不符合函数定义。
修正方案
方案1:手动封装Promise
将回调式的异步操作封装成Promise,通过resolve返回结果,reject抛出错误:
const binance = require("./binance.js"); function getBalance() { return new Promise((resolve, reject) => { binance.balance((error, balances) => { if (error) { console.error(error); reject(error); return; } const usdtBalance = balances.USDT.available; console.info("USDT Test balance: ", usdtBalance); resolve(usdtBalance); }); }); } // 正确调用方式 getBalance() .then(data => { console.log("USDT Actual balance: ", Math.round(data)); }) .catch(err => console.error(err)); module.exports = getBalance;
方案2:使用util.promisify转换回调函数
利用Node.js内置的util.promisify将回调方法转换为Promise版本,写法更简洁:
const binance = require("./binance.js"); const { promisify } = require('util'); // 转换回调方法为Promise格式 const getBinanceBalance = promisify(binance.balance); async function getBalance() { try { const balances = await getBinanceBalance(); const usdtBalance = balances.USDT.available; console.info("USDT Test balance: ", usdtBalance); return usdtBalance; } catch (error) { console.error(error); throw error; } } // 正确调用方式 getBalance() .then(data => console.log("USDT Actual balance: ", Math.round(data))) .catch(err => console.error(err)); module.exports = getBalance;
外部文件调用验证
修正后的getBalance返回Promise,外部使用await或.then()都能正常获取结果:
const getBalance = require('./module1'); async function getBalanceData() { try { const tBalance = await getBalance(); console.log("Budget:", tBalance); return tBalance; } catch (error) { console.error("Error fetching budget:", error); } } getBalanceData().then(tBalance => { console.log("Try getting the balance here:", tBalance); });
关键说明
- 异步回调的执行顺序晚于同步代码,必须通过Promise或
async/await等待异步操作完成后再返回结果。 async函数内如果没有await异步操作,会直接同步返回,无法获取异步结果。
内容的提问来源于stack exchange,提问作者Duane Bednorz
相关产品推荐
相关产品推荐

