回调函数中如何处理异步响应?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
相关产品推荐
相关产品推荐

