分批执行承诺,即使有些失败
Executing promises in batches even if some failed
我正在尝试以 20 个为一组创建用户。我已经创建了执行此操作的函数,并将它们全部放在一个带有计数器的“promises”数组中。
当计数器达到 20 或用户总数已上传时,我执行数组中的所有承诺。
这工作正常,直到其中一个函数 returns 出现错误,这会破坏整个代码,即使它处于用户总数的循环中:
for (const user of usersjson.users) {
{functions}
if (promises.length == 20 || i == usersjson.users.length) {
await Promise.allSettled(promises)
.then((responses)=> {
for (const response of responses) {
if (response.value.status == 204) {
console.log(`${response.value.status}: User ${response.value.request.path.substring(7)} was updated.`);
} else {
if (response.value.status == 201 && response.value.headers.location) {
console.log(`${response.value.status}: User ${response.value.headers['location']} was created.`);
} else {
console.log(response.value.headers.location);
}
}
}
}).catch((err)=> {
console.log(err);
});
promises=[];
}
}
即使其中一个函数 returns 出错并且捕获被激活,我如何让循环继续?
您使用了 Promise.allSettled()
,它会在数组中的每个 Promise 解析或拒绝时解析。 Promise.allSettled()
本身永远不会拒绝。这意味着您可以在 Promise.allSettled()
解析后检查数组中的某些 Promise 是否被拒绝,在这种情况下在您的业务逻辑中处理它。你可以这样做:
Promise.allSettled(promises).then((responses) => {
responses.forEach((response) => {
if (response.status === 'fulfilled') {
// Promise resolved
} else {
// Promise rejected
}
})
})
我正在尝试以 20 个为一组创建用户。我已经创建了执行此操作的函数,并将它们全部放在一个带有计数器的“promises”数组中。 当计数器达到 20 或用户总数已上传时,我执行数组中的所有承诺。 这工作正常,直到其中一个函数 returns 出现错误,这会破坏整个代码,即使它处于用户总数的循环中:
for (const user of usersjson.users) {
{functions}
if (promises.length == 20 || i == usersjson.users.length) {
await Promise.allSettled(promises)
.then((responses)=> {
for (const response of responses) {
if (response.value.status == 204) {
console.log(`${response.value.status}: User ${response.value.request.path.substring(7)} was updated.`);
} else {
if (response.value.status == 201 && response.value.headers.location) {
console.log(`${response.value.status}: User ${response.value.headers['location']} was created.`);
} else {
console.log(response.value.headers.location);
}
}
}
}).catch((err)=> {
console.log(err);
});
promises=[];
}
}
即使其中一个函数 returns 出错并且捕获被激活,我如何让循环继续?
您使用了 Promise.allSettled()
,它会在数组中的每个 Promise 解析或拒绝时解析。 Promise.allSettled()
本身永远不会拒绝。这意味着您可以在 Promise.allSettled()
解析后检查数组中的某些 Promise 是否被拒绝,在这种情况下在您的业务逻辑中处理它。你可以这样做:
Promise.allSettled(promises).then((responses) => {
responses.forEach((response) => {
if (response.status === 'fulfilled') {
// Promise resolved
} else {
// Promise rejected
}
})
})