【发布时间】:2020-02-18 04:45:12
【问题描述】:
我正在编写一个函数来使用 Node.js 写入 AWS Kinesis firehose。写入 firehose 流的 AWS 函数调用根据操作结果返回“错误”或“数据”。如果出现错误,对于特定的错误代码,我需要使用exponentialBackoff 重试相同的请求。我正在使用 setTimeOut 为每次后续重试触发相同的方法,但时间不同,但看起来每当重试时,我都没有正确解决,我的测试失败并抱怨“错误:超过 5000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回一个 Promise,确保它解析。"
async function batchWrite(records,firehose,retry = 0){
var readingObjects = getReadings(records);
var params = {
DeliveryStreamName: process.env.KINESIS_FIREHOSE_STREAM_DELIVERY,
Records: readingObjects
};
return await new Promise(function(resolve,reject){
firehose.putRecordBatch(params,function(error,data){
if(error){
if(error.code == 'ServiceUnavailableException' && retry < retries.length){
console.log('retryCount=',retry);
setTimeout(batchWrite,retries[retry],records,firehose,retry+1);
console.log('setTimeout',retry);
}
else{
// console.log('Error',error);
console.log('resolving');
resolve(error);
}
}
else{
if(data.FailedPutCount > 0){
//colect the RequestResponses which are not processed.
//index of those records is same as in request
//process those faied records again
console.log('Error',data);
}
resolve(data);
}
});
});
}
对于上面的函数,在测试用例中,我通过返回具有 ServiceUnavailableException 的响应来模拟错误情况,以便它重试,但在所有重试之后,测试超时。有什么我需要更改才能使其正常工作的吗?
【问题讨论】:
-
如果我理解正确,您需要将您的 promise 解析(并在需要时拒绝)方法传递给所有异步操作。当您调用 setTimeout 并重试操作时,您可能希望传递 resolve 函数并在完成后调用它。否则,最初的承诺永远不会被解决。
标签: node.js amazon-web-services promise amazon-kinesis-firehose