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

为何Promise的then()未触发、返回值异常且async判断结果错误?

问题分析与修复方案

核心问题1:isTokenExists 未正确触发Promise状态变更

你在isTokenExists里创建了外层Promise,但内部错误地用Promise.resolve()代替了外层Promise的resolve回调——这只会生成新的已决Promise,不会改变外层Promise的状态,导致它一直处于pending,自然不会触发后续的.then()。另外还误用了位运算符|,应该用逻辑或||。

修复后的isTokenExists

export const isTokenExists = () => {
  return new Promise((resolve) =>
    setTimeout(() => {
      const token = localStorage.getItem("Token");
      // 替换位运算符为逻辑或,直接调用resolve变更外层Promise状态
      if (token === null || token === undefined) {
        console.log("token null or undefined");
        resolve(false);
      } else {
        resolve(true);
      }
    }, 3000)
  );
};

核心问题2:tokenExist 写法优化(可选)

await和.then()混用虽语法合法,但没必要,直接用await更简洁:

export const tokenExist = async () => {
  const result = await isTokenExists();
  console.log(result);
  return result;
};

核心问题3:Signin.js 未正确处理异步返回值

tokenExist()是异步函数,返回的是Promise对象,而Promise在布尔判断中永远是真值,所以if(tokenResult)永远走true分支。必须等待Promise完成后再判断:

修复后的Signin.js

// 用async/await处理
const checkToken = async () => {
  const tokenResult = await tokenExist();
  if (tokenResult) {
    console.log('token result success');
  } else {
    console.log('token result failed');
  }
};
checkToken();

// 或者用.then()处理
tokenExist().then(tokenResult => {
  if (tokenResult) {
    console.log('token result success');
  } else {
    console.log('token result failed');
  }
});

验证结果

修复后:

  • 当localStorage无Token时,3秒后打印token null or undefined,随后输出token result failed
  • 当Token存在时,3秒后输出token result success

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:31:02