异步API调用函数无法正确处理409个拒绝

时间:2018-08-16 20:18:15

标签: javascript node.js asynchronous promise es6-promise

我正在使用第三方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个最大并发请求,等等,但仍然在循环中收到上述错误。我在这里做什么错了?

0 个答案:

没有答案