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

JavaScript异步调用错误捕获及accept.js异步请求问题咨询

我来分两部分帮你解决这两个问题:

一、JavaScript中捕获异步调用错误的常见方式

异步代码的错误捕获和同步代码略有不同,主要分以下几种场景:

  • 回调函数模式:
    传统的异步API大多用回调传递结果,通常会把错误作为回调的第一个参数(类似Node.js的约定)。你只需要在回调里先判断错误是否存在:

    // 示例:读取文件的异步调用
    fs.readFile('/path/to/file', (err, content) => {
      if (err) {
        console.error('读取文件失败:', err);
        return; // 后续逻辑不再执行
      }
      // 处理文件内容
      console.log(content);
    });
    

    如果是其他回调风格(比如错误在第二个参数),记得对应检查错误参数。

  • Promise模式:
    用Promise封装的异步操作,可以通过.catch()方法捕获整个Promise链中的错误:

    fetch('/api/get-data')
      .then(res => {
        // 先判断HTTP响应是否正常,否则主动抛出错误
        if (!res.ok) throw new Error(`请求失败:${res.status}`);
        return res.json();
      })
      .then(data => console.log('获取到数据:', data))
      .catch(err => console.error('请求出错:', err));
    

    不管是Promise内部的错误,还是.then()里抛出的错误,都会被最后的.catch()捕获。

  • async/await模式:
    用try/catch包裹异步操作,写法和同步代码的错误处理几乎一致,可读性更强:

    async function fetchData() {
      try {
        const res = await fetch('/api/get-data');
        if (!res.ok) throw new Error(`请求失败:${res.status}`);
        const data = await res.json();
        console.log('获取到数据:', data);
      } catch (err) {
        console.error('请求出错:', err);
      }
    }
    fetchData();
    

    try块里所有的await异步操作出错,都会直接进入catch块处理。

二、针对Accept.js的sendPaymentDataToAnet函数的错误捕获

Accept.js的sendPaymentDataToAnet是异步提交支付数据的核心函数,它的错误捕获要结合它的调用方式来处理:

  • 使用官方推荐的回调方式:
    官方的调用方式会传入包含success和error的配置对象,你可以直接在error回调里处理异步发送时的错误:

    function sendPaymentDataToAnet() {
      // 1. 先打包支付数据(比如从表单获取信用卡信息)
      const paymentData = {
        opaqueData: {
          dataDescriptor: 'COMMON.ACCEPT.INAPP.PAYMENT',
          dataValue: /* 生成的加密值 */
        },
        // 其他必要参数
      };
    
      // 2. 调用Accept.dispatchData发送数据
      Accept.dispatchData(paymentData, {
        success: function(response) {
          // 处理成功响应,比如提交到你的后端
          console.log('支付数据发送成功:', response);
        },
        error: function(errorObj) {
          // 这里捕获异步发送的错误
          console.error('支付数据发送失败:', errorObj);
          // 把错误信息展示给用户
          document.getElementById('payment-error').textContent = errorObj.errorText;
        }
      });
    }
    

    这里的errorObj包含errorCode和errorText等关键信息,可以根据这些信息给用户更精准的提示(比如“信用卡过期”“无效卡号”)。

  • 转换成Promise风格(适配async/await):
    如果你习惯用async/await,可以把这个函数包装成Promise,这样就能用try/catch统一处理错误:

    // 包装成Promise版本的函数
    function sendPaymentDataToAnetAsync() {
      return new Promise((resolve, reject) => {
        const paymentData = {
          // 你的支付数据
        };
    
        Accept.dispatchData(paymentData, {
          success: resolve,
          error: reject
        });
      });
    }
    
    // 用async/await调用并捕获错误
    async function handlePaymentSubmit(e) {
      e.preventDefault(); // 阻止表单默认提交
    
      try {
        const response = await sendPaymentDataToAnetAsync();
        // 处理成功逻辑,比如提交到后端
        console.log('成功:', response);
      } catch (err) {
        // 捕获错误
        console.error('出错:', err);
        document.getElementById('payment-error').textContent = err.errorText;
      }
    }
    
    // 给表单绑定提交事件
    document.getElementById('payment-form').addEventListener('submit', handlePaymentSubmit);
    
  • 额外提醒:
    在调用异步函数之前,最好先做同步的表单验证(比如检查信用卡号格式、有效期是否合法),避免无效的异步请求,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:38:02