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

为何变量players与currentPlayer显示未定义?异步函数使用疑问

问题原因与解决方案

核心问题

你代码里的setPlayers()是异步函数(带async标记),这类函数执行后不会直接返回最终的玩家数组,而是返回一个Promise对象。你直接把这个Promise赋值给players变量,然后去取players[0],但Promise对象没有索引属性,所以currentPlayer会变成undefined,后续其他函数调用时自然会提示变量未定义。

两种修复方案

方案1:用async/await处理异步结果

把变量赋值和后续逻辑放在一个异步初始化函数里,用await等待setPlayers()的Promise完成,拿到真正的数组:

let message = document.getElementById('game-message');

async function setPlayers() {
    message.innerHTML = `<p>Name of player One?</p>`;
    let player1 = await getUserInput();
    message.innerHTML = `<p>Name of player Two</p>`;
    let player2 = await getUserInput();
    const players = [];
    players.push(player1, player2);
    return players;
}

// 初始化游戏的异步函数
async function initGame() {
    var players = await setPlayers(); // 等待Promise解析,拿到真实的玩家数组
    var currentPlayer = players[0];
    // 所有需要用到players和currentPlayer的代码都要放在这里或者后续的异步步骤里
    console.log(currentPlayer);
}

// 启动初始化
initGame();

方案2:用.then()处理Promise回调

如果不想额外写初始化函数,可以直接用Promise的.then()方法获取结果:

let message = document.getElementById('game-message');

async function setPlayers() {
    message.innerHTML = `<p>Name of player One?</p>`;
    let player1 = await getUserInput();
    message.innerHTML = `<p>Name of player Two</p>`;
    let player2 = await getUserInput();
    const players = [];
    players.push(player1, player2);
    return players;
}

setPlayers().then(players => {
    var currentPlayer = players[0];
    // 依赖players和currentPlayer的逻辑写在这里
    console.log(currentPlayer);
});

关键注意点

所有依赖players和currentPlayer的代码,必须等Promise完成后再执行——也就是要么放在await之后,要么放在.then()的回调函数里。如果提前执行,会因为变量还没拿到真实值而报错。

内容的提问来源于stack exchange,提问作者NovaBrownie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:05