在nodejs中重做任务,如果promise失败,直到达到maxLimit

时间:2015-06-19 11:00:28

标签: javascript node.js promise q

我有NetowrkIO和网络在这种情况下不可靠的功能所以在这里它可能无法在第一次尝试,所以我需要重试,如​​果它失败 这是伪代码

count = 0
maxLimit = 10
success = false
while ( (success == false) && (count < maxLimit))
{
    try 
    {
        doNetworkIO(arg)
        success = true
    }
    catch(ex)
    {
        count += 1
    }
}

if( success == true )
{
    reportSuccess()
} else {
    reportFailure()
}

现在我试图在nodejs中这样做。我搜索并提出承诺作为一种方式。但我不知道怎么做。 这是我的代码。

var count = 0
var maxLimit = 10
doNetworkIO(arg)
    .then(reportSuccess)
    .catch(function () {
        if(count < maxLimit)
        {
            count += 1
            // => redo operation if count < limit
            // => help needed here
        }
        else {
            reportFailure()
        }
    })

在这里,我不确定再次重做它。

如果你有不同的任务方法,请分享。

1 个答案:

答案 0 :(得分:2)

你可以写一个重试函数,它会将自己附加在失败处理程序中,就像这个

一样
var count = 0;
var maxLimit = 10;

function tryNetworkIO() {
    if (count < maxLimit) {
        count += 1;
        return doNetworkIO(arg).then(reportSuccess).catch(tryNetworkIO);
    } else {
        reportFailure();
    }
}

受到this answer的启发,你可以稍微改善这一点,只需在结尾处附加reportSuccess一次,当承诺真的解决时,就像这样

var count = 0;
var maxLimit = 10;

function tryNetworkIO() {
    if (++count < maxLimit) {
        return doNetworkIO(arg).catch(tryNetworkIO);
    } else {
        throw new Error('Exceeded maximum number of retries');
    }
}

tryNetworkIO().then(reportSuccess).catch(reportFailure);