提问人:z123 提问时间:10/25/2023 最后编辑:radar155z123 更新时间:10/25/2023 访问量:24
executeNextBatch() 并不总是返回 promise。nodejs 承诺/等待
executeNextBatch() doesn't always return a promise. nodejs promise/await
问:
我有一个循环函数,它循环遍历项目列表并设置项目的图像(如果数据库中存在),如果没有,它使用 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。如何在不删除批处理承诺限制的情况下解决此问题。
答: 暂无答案
评论
index
batches.length
Promise.resolve()