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

回调函数中如何处理异步响应?serverless下使用createsend-node实操问题

问题原因

addSubscriber 属于回调风格的异步方法,当前使用的 async 类型 serverless handler 不会等待回调执行完成就会结束函数生命周期,回调内部的 return 语句不会被作为函数的响应返回给调用方,因此代码无法正常运行。若将 return 语句写在调用逻辑外部,函数会直接提前返回结果,和 API 实际执行结果无关联。

解决方案

方案1:回调封装为 Promise 配合 async/await(推荐)

将回调方法封装为 Promise 后用 await 等待执行结果,再根据执行状态返回对应响应:

exports.handler = async (event, context) => {
  const body = JSON.parse(event.body);
  const listId = process.env.CM_LIST_ID;
  const details = body;

  try {
    // 封装回调方法为Promise并等待执行完成
    await new Promise((resolve, reject) => {
      api.subscribers.addSubscriber(listId, details, (err, res) => {
        if (err) return reject(err);
        resolve(res);
      });
    });
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'success' })
    };
  } catch (err) {
    return {
      statusCode: 400,
      body: JSON.stringify({ message: err })
    };
  }
};

方案2:使用回调风格的 handler

如果所用 serverless 平台支持回调风格的 handler,可直接移除 async 声明,用 handler 自带的回调参数返回结果,原有逻辑改动最小:

exports.handler = (event, context, callback) => {
  const body = JSON.parse(event.body);
  const listId = process.env.CM_LIST_ID;
  const details = body;

  api.subscribers.addSubscriber(listId, details, (err, res) => {
    if (err) {
      callback(null, {
        statusCode: 400,
        body: JSON.stringify({ message: err })
      });
      return;
    }
    callback(null, {
      statusCode: 200,
      body: JSON.stringify({ message: 'success' })
    });
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:24:05