如何在Wix HTTP函数中循环调用Promise函数并返回结果列表
问题原因
你当前代码的核心问题是没有等待所有myGetMemberFunction的异步请求完成就返回了邮箱列表。for循环是同步执行的,循环里发起的异步请求会在后台运行,而loginEmails会在这些请求完成前就被return,所以最终得到的是空数组。
解决方法
使用Promise.all()批量处理所有会员信息的异步请求,确保所有请求完成后再收集邮箱并返回。同时调整代码结构,符合Wix HTTP函数的规范(HTTP函数需要导出处理函数,而非依赖$w.onReady)。
修正后的代码:
const myListOrdersFunction = require('backend/test').myListOrdersFunction; const myGetMemberFunction = require('backend/getMember').myGetMemberFunction; // Wix HTTP函数需导出异步处理函数 export async function getOrderBuyerEmails(request) { try { // 获取订单列表 const listedOrders = await myListOrdersFunction(); // 生成所有获取会员信息的Promise数组 const memberPromises = listedOrders.map(order => { return myGetMemberFunction(order.buyer.memberId) .catch(error => { console.error('获取会员信息失败:', error); // 单个请求出错返回null,避免整个Promise.all失败 return null; }); }); // 等待所有会员请求完成 const members = await Promise.all(memberPromises); // 过滤无效数据,收集有效邮箱 const loginEmails = members .filter(member => member !== null) .map(member => member.loginEmail); // 返回API响应 return { status: 200, body: { emails: loginEmails } }; } catch (error) { console.error('获取订单列表失败:', error); // 处理全局错误 return { status: 500, body: { error: '获取数据失败' } }; } }
关键说明
Promise.all():将多个Promise打包为一个,只有当所有Promise完成(或单个失败)时才会resolve,确保能拿到所有会员数据后再处理。map替代for循环:用map生成Promise数组,比for循环更简洁,也更适配Promise.all的使用场景。- 分层错误处理:在单个会员请求的
catch中返回null,避免单个请求失败导致整个API响应崩溃;全局try/catch处理订单获取的整体错误。 - HTTP函数规范:Wix HTTP函数需要导出异步函数,接收
request参数,返回包含status和body的响应对象,$w.onReady是前端页面的初始化函数,不适用于HTTP函数场景。
内容的提问来源于stack exchange,提问作者Amna Ahmad
相关产品推荐
相关产品推荐

