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

Promise.all中queryPexels未返回值致imgSuggestions为undefined问题

问题分析与解决方案

核心问题

  1. queryPexels函数未正确返回Promise:虽然标记为async,但内部使用.then链式调用时未返回整个Promise链,导致函数默认返回一个值为undefined的resolved Promise,这就是imgSuggestions最终为undefined的根本原因。
  2. Promise.all用法错误:当前在Promise.all数组中直接用await,会变成串行执行异步操作,完全浪费了Promise.all并行执行的优势。

修复步骤

1. 修复queryPexels函数

改用await语法简化代码,并确保函数返回最终结果:

async function queryPexels(pexelsConfig, query, photosPerPage) {
  try {
    const res = await queryOpenAiKeywords(invocation.openAiConfig, query);
    const trad = (await translateTxt(res)).toString();
    const client = new Client({ apiKey: pexelsConfig.key });
    const response = await getPexelsPhotos(trad, client, photosPerPage);
    const photos = choosePhotos(response.photos);
    console.log(photos);
    return photos;
  } catch (err) {
    console.log(err);
    throw err; // 抛出错误让上层捕获
  }
}

如果坚持用.then链式调用,必须返回整个Promise链:

function queryPexels(pexelsConfig, query, photosPerPage) {
  return queryOpenAiKeywords(invocation.openAiConfig, query)
    .then(res => translateTxt(res))
    .then(translate => translate.toString())
    .then(trad => {
      const client = new Client({ apiKey: pexelsConfig.key });
      return getPexelsPhotos(trad, client, photosPerPage);
    })
    .then(response => {
      const photos = choosePhotos(response.photos);
      console.log(photos);
      return photos;
    })
    .catch(err => {
      console.log(err);
      throw err;
    });
}

2. 优化Promise.all的用法

直接传入Promise数组,通过返回值解构获取结果,实现并行执行:

if (foundRegistries.products.some((product) => product.id === productId)) {
  foundProduct = foundRegistries.products.filter(
    (product) => product.id === productId
  );
  
  const queryImage = foundProduct[0].productName.toString();
  
  return Promise.all([
    queryPexels(pexelsConfig, queryImage, photosPerPage),
    queryOpenAiLabel(
      openAiConfig,
      foundProduct[0].productName,
      foundProduct[0].targetAudience
    ),
    queryOpenAiHeading(openAiConfig, foundProduct[0].productName),
    getFonts(googleConfig, foundRegistries.font, foundRegistries.fontVariant)
  ]).then(([imgSuggestions, labelSeggestions, headingSuggestions, fontDownloadLink]) => {
    return {
      productId,
      imgSuggestions,
      labelSeggestions,
      headingSuggestions,
      fontDownloadLink
    };
  }).catch(error => {
    throw error;
  });
} else {
  return Promise.resolve({
    Error: "No product found. Please check provided product ID."
  });
}

额外说明

  • 原代码手动嵌套new Promise(async (resolve, reject) => {})属于反模式,Promise.all本身返回Promise,直接返回即可。
  • 统一错误处理:在queryPexels中抛出错误,上层Promise.all会统一捕获,避免错误被吞掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:15:05