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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:33:10