如果失败X次,则nodejs重试功能

问题描述 投票:0回答:3

我希望我的函数执行X(= 3)次直到成功。

在我的情况下,我正在运行kinesis.putRecord(来自AWS API),如果它失败了 - 我想再次运行它,直到它成功,但不超过3次尝试。

我是NodeJS的新手,我写的代码闻起来很糟糕。

const putRecordsPromise = function(params){
    return new Promise((resolve, reject) => {
        kinesis.putRecord(params, function (err, data) {
            resolve(err)
        });
    })
}

async function waterfall(params){
    try{
        let triesCounter = 0;
        while(triesCounter < 2){
            console.log(`try #${triesCounter}`)
            let recordsAnswer = await putRecordsPromise(params)
            if(!recordsAnswer){
                console.log("success")
                break;
            }
            triesCounter += 1;
        }
        // continue ...

    } catch(err){
        console.error(err)
    }
}

waterfall(params)

我保证错误的结果。之后,如果错误是空的,那么一切都好。否则,继续运行相同的命令。

我确信有一种更聪明的方法可以做到这一点。任何帮助,将不胜感激。

node.js amazon-web-services promise callback async-await
3个回答
4
投票

我认为,所有的Aws函数都可以开箱即用,然后你可以把调用放到try/catch

let triesCounter = 0;
while(triesCounter < 2){
    console.log(`try #${triesCounter}`)
    try {
        await kinesis.putRecord(params).promise();
        break;  // 'return' would work here as well
    } catch (err) {
       console.log(err);
    }
    triesCounter ++;
}

1
投票

制作一个小模块,比如try-and-try-again.js

exports = module.exports = tryAndTryAgain;

function tryUntilSuccess( maxTries, thisContext , fn, ...argv) {
  let success = false;

  for (let i = i ; i < maxTries && !success ; ++i ) {
    let rc = fn.apply(thisContext, args);
    success = rc == 0 ? true : false;
  }

  return success;
}

然后你可以在任何地方使用它:

const tryAndTryAgain = require('./try-and-try-again');

function somethingThatMightNeedARetry() { ... }

const succeeded = tryAndTryAgain( 3 , null, somethingThatMightNeedARetry, 'arg-1', 'arg-2', 'arg-3' );

1
投票

功能风格:

...
await tryUntilSucces(() => kinesis.putRecord(params).promise());
...

async function tryUntilSucces(promiseFn, maxTries=3) {
    try {
        return await promiseFn();
    } catch (e) {
        if (maxTries > 0) {
            return tryUntilSucces(promiseFn, maxTries - 1);
        }
        throw e;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.