我正在使用第三方API,该API快速返回409s超级duper,所以我使用async的eachLimit方法来限制并发请求的数量。我第一次或两次打电话得到200,然后一吨409s,最终这个错误循环出现:
(node:16570) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 783)
调用该函数的代码使用异步库:
const extraServicesPromises = [];
async.eachLimit(bookings, 3, (booking, callback) => {
try {
extraServicesPromises.push(getExtraServicesByBookingId(booking.UniqueId));
} catch (e) {
console.log('Error getting extra services by Booking ID: ', e);
}
callback();
});
和请求功能:
async function getExtraServicesByBookingId(id) {
return new Promise((resolve, reject) => {
try {
request({
url: 'https://spaces.nexudus.com/api/billing/coworkerextraservices',
qs: {
CoworkerExtraService_BookingUniqueId: id
},
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Basic ' + new Buffer(process.env.nexudusEmail + ':' + process.env.nexudusPassword, 'utf8').toString('base64')
}
}, (error, response, body) => {
if (error) {
reject(error);
} else {
if (response.statusCode === 200) {
resolve(JSON.parse(body).Records);
} else if (response.statusCode === 409) {
//console.log(`!!!!${JSON.stringify(response.headers['retry-after'])}`);
setTimeout(() => {
resolve(getCoworkerById(id));
}, 1000);
} else {
reject(response);
}
}
});
//
} catch (error) {
console.log("error in getExtraServicesByBookingId: ${error}");
}
});
}
我尝试过两次重试之间有2次以上的超时,有1个最大并发请求,等等,但仍然在循环中收到上述错误。我在这里做什么错了?