executeNextBatch() 并不总是返回 promise。nodejs 承诺/等待

executeNextBatch() doesn't always return a promise. nodejs promise/await

提问人:z123 提问时间:10/25/2023 最后编辑:radar155z123 更新时间:10/25/2023 访问量:24

问:

我有一个循环函数,它循环遍历项目列表并设置项目的图像(如果数据库中存在),如果没有,它使用 openAI 为项目生成图像并将其保存到数据库,同时将其返回给 api。我遇到的问题是,尽管项目图像生成并成功保存到数据库,但在对已解决的承诺运行 then 函数时,我遇到了未定义的错误。

我知道我混合了 then 和 await 的用法,但对如何解决此错误有点困惑。

我的函数将图像与项目匹配或为项目生成新图像是:

function findImagesForObjectsOrGenerate(listOfObjects, images, isCategory, merchantId) {
  const MAX_REQUESTS_PER_MINUTE = 1;
  const requestsPerBatch = Math.min(MAX_REQUESTS_PER_MINUTE, listOfObjects.length);

  let promises = [];
  if (listOfObjects.length > 0) {
    listOfObjects.forEach((object) => {
      const matchedImage = images.find(image => {
        return object.id === image.cloverDataId;
      });

      if (matchedImage) {
        object.imageData = matchedImage.imageData;
      } else {
        promises.push(() => imageService.generateImageByNameAndSave(object.name, isCategory, object.id, merchantId));
      }
    })
  }

  // Define a function to execute a batch of promises
  function executeBatch(batch) {
    return Promise.all(batch.map(fn => fn()));
  }

  // Split promises into batches
  const batches = [];
  while (promises.length > 0) {
    batches.push(promises.splice(0, requestsPerBatch));
  }

  // Execute each batch with a delay between them
  let index = 0;
  function executeNextBatch() {
    if (index < batches.length) {
      return executeBatch(batches[index++])
        .then(() => new Promise(resolve => setTimeout(resolve, 60000 / MAX_REQUESTS_PER_MINUTE)))
        .then(executeNextBatch);
    }
  }

  return executeNextBatch().then(() => {
    return listOfObjects;
  });
}

使用 openai 生成图像并将其保存到数据库的函数 generateImageByNameAndSave 为:

async function generateImageByNameAndSave(imageName,isCategory,cloverDataId, merchantId) 
{
  try {
    // console.log("getAllCategories name: ", name);
    imageName = imageName.replace('/', ' ');
    const newImage = await openai.images.generate({
      prompt: imageName,
      response_format: 'b64_json',
      n: 1,
      size: "256x256",
    },{
      validateStatus: function (status) {
        return status < 500; // Resolve only if the status code is less than 500
      }
    }).catch((e) => {
      console.log('imageName ' + JSON.stringify(imageName));
      console.log('e ' + JSON.stringify(e));
      if (e.data.error.message.includes('safety system')) {
        return 'something'
      }

      console.error(e)
    });
      const image = new Image();
      if (merchantId) {
        image.merchantId = merchantId;
      }
      image.isCategory = isCategory;
      image.cloverDataId = cloverDataId;
      image.merchantId = merchantId;
      image.cloverDataName = imageName;
      image.imageData = 'data:image/png;base64,' +newImage.data[0].b64_json;
    // console.log('image ' + JSON.stringify(image.imageData));
    console.log('cloverDataId ' + JSON.stringify(image.cloverDataId));

      const matchedItem = await image.save(image);
      return Promise.resolve(matchedItem);
  } catch (e) {
    throw new Error(e);
  }
}

我得到的错误是:

TypeError: Cannot read properties of undefined (reading 'then')
    at Object.findImagesForObjectsOrGenerate (/cloverApi.service.js:178:28)
    at Object.getAllCategoriesWithImages (/cloverApi.service.js:93:25)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)


TypeError: Cannot read properties of undefined (reading 'then')
    at Object.findImagesForObjectsOrGenerate (cloverApi.service.js:178:28)
    at Object.getAllCategoriesWithImages (cloverApi.service.js:93:25)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

错误指向 findImagesForObjectsOrGenerate 函数中的这部分代码:

return executeNextBatch().then(() => {
    return listOfObjects;
  });

这个问题是 executeNextBatch() 并不总是返回 promise。如何在不删除批处理承诺限制的情况下解决此问题。

JavaScript 节点.js 异步 承诺 OpenAI-API

评论

0赞 Konrad 10/25/2023
如果大于,则返回任何内容,而不是承诺。请改为返回indexbatches.lengthPromise.resolve()
0赞 z123 10/25/2023
它没有用,不是 API 没有返回任何东西

答: 暂无答案