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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:32:12