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

如何实现包含setTimeout、支持参数传入与错误处理的回调函数?附加法回调函数实现疑问求助

实现带延迟、参数支持和错误处理的回调式加法函数

首先,咱们先理清你现有代码里的几个核心问题,再一步步调整到符合要求的实现:

1. 理解Error-First回调的正确结构

你提到要遵循error-first规范,但当前addCallback的写法有点颠倒了——error-first是指回调函数本身的第一个参数是错误对象,而不是把err作为参数传给addCallback。正确的逻辑应该是:我们先执行可能出错的操作,捕获错误后传给回调;如果成功,就把结果传给回调(此时第一个参数为null)。

另外,IDE提示add已在上级作用域是完全正确的,你不需要把add作为参数传给addCallback,直接在回调里使用即可。

2. 核心问题:异步操作的结果传递

你的addCallback里用了setTimeout,但没有把加法的结果(或错误)传递出去——因为异步操作不能直接返回值,必须通过回调函数把结果“通知”调用者。

3. 正确的实现方案

我们需要创建一个带回调的加法入口函数(比如叫addWithCallback),它接收两个数字和一个error-first风格的回调,然后在内部用setTimeout延迟执行加法逻辑,同时处理错误:

// 验证输入是否为数字
function numbersValidation(number1, number2) {
  if (!Number.isFinite(number1) || !Number.isFinite(number2)) {
    throw new TypeError('Only numbers are allowed');
  }
}

// 加法函数
function add(number1, number2) {
  numbersValidation(number1, number2);
  return number1 + number2;
}

// 带回调和延迟的加法函数
function addWithCallback(number1, number2, callback) {
  // 用setTimeout实现100ms延迟
  setTimeout(() => {
    try {
      // 执行加法,这里会触发验证逻辑
      const result = add(number1, number2);
      // 成功时,第一个参数传null,第二个参数传结果
      callback(null, result);
    } catch (err) {
      // 捕获验证或其他错误,传给回调的第一个参数
      callback(err);
    }
  }, 100);
}

4. 如何调用这个函数

按照error-first规范,调用时先判断错误,再处理结果:

// 正常调用(成功场景)
addWithCallback(2, 3, (err, result) => {
  if (err) {
    console.error('加法出错:', err.message);
    return;
  }
  console.log('加法结果:', result); // 100ms后输出5
});

// 错误调用(传入非数字)
addWithCallback(2, 'abc', (err, result) => {
  if (err) {
    console.error('加法出错:', err.message); // 100ms后输出"Only numbers are allowed"
    return;
  }
  console.log('加法结果:', result);
});

关键知识点总结

  • Error-First回调规则:回调函数的第一个参数永远是错误对象(成功时为null),后续参数是成功结果。
  • 异步逻辑的错误处理:因为setTimeout是异步的,所以必须把验证和加法逻辑放在setTimeout内部,并用try-catch捕获同步错误,再通过回调传递——如果把验证放在setTimeout外面,错误会直接抛出而不是传给回调。
  • 作用域的利用:add和numbersValidation在addWithCallback的上级作用域,不需要额外传递参数,直接使用即可。
  • 异步操作的结果传递:异步函数不能直接返回结果,必须通过回调函数把结果“交付”给调用者。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:47:36