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

如何用async/await返回非undefined的Promise及处理错误?

问题分析与解决方案

一、测试失败的原因及修复

你的测试报错3 == undefined,核心问题是**delayedPromise的调用方式错误**:
原delayedPromise仅接受一个参数ms,作用是延迟ms毫秒后调用无参数的resolve(),而你传入了add(num1, num2)和100两个参数,导致:

  1. delayedPromise实际接收的ms是add(1,2)的结果3,延迟3毫秒后执行resolve()
  2. 由于resolve()未传值,await得到的结果为undefined

修复后的addAwait

正确逻辑是先完成加法计算与验证,再等待100毫秒返回结果;或先等待再执行加法,两种写法均可行:

// 先计算再延迟
const addAwait = async (num1, num2) => {
  const sum = add(num1, num2);
  await delayedPromise(100);
  return sum;
};

// 或先延迟再计算(模拟异步计算场景)
const addAwait = async (num1, num2) => {
  await delayedPromise(100);
  return add(num1, num2);
};

二、你的两个疑问解答

1. 为什么delayedPromise没有reject逻辑?

delayedPromise的设计目标是仅提供延迟完成的能力,它依赖的setTimeout在正常使用下不会产生可捕获的异步错误(若ms参数非法,属于同步参数错误,不会进入Promise异步流程)。
如果需要扩展支持主动reject,可以修改函数:

const delayedPromise = (ms, shouldReject = false) => 
  new Promise((resolve, reject) => {
    setTimeout(() => {
      shouldReject ? reject(new Error('Delay failed')) : resolve();
    }, ms);
  });

但原函数的定位是单纯的延迟工具,因此不需要reject逻辑。

2. add函数抛出错误时,如何处理reject?

async函数中,同步代码抛出的错误会自动转化为Promise的reject状态,你有两种处理方式:

方式一:在addAwait内部捕获错误

const addAwait = async (num1, num2) => {
  try {
    const sum = add(num1, num2);
    await delayedPromise(100);
    return sum;
  } catch (err) {
    // 可自行处理错误,比如包装后重新抛出
    throw new Error(`加法执行失败:${err.message}`);
  }
};

方式二:在调用addAwait时捕获错误

// 测试用例示例
it('handles invalid inputs', async () => {
  try {
    await calculator.addAwait('a', 2);
    assert.fail('预期抛出错误但未触发');
  } catch (err) {
    assert.equal(err.message, 'Only numbers are allowed');
  }
});

// 或使用.catch()链式调用
calculator.addAwait('a', 2).catch(err => {
  console.error('输入错误:', err.message);
});

由于add是同步执行的,错误会在await语句前触发,async函数会直接返回rejected状态的Promise,无需手动创建reject逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:15:53