重做承诺链错误

时间:2016-01-08 10:29:53

标签: node.js promise es6-promise

当我在承诺中捕获异常时,是否可以再次重做承诺或称为反模式?我知道异常不应该充当流量控制器,但我似乎无法找到任何其他解决方案来解决我的问题。 请考虑以下代码:

function a() {
    var flow = GenerateUsername().then(RegisterUserWithGeneratedUsername()).catch(DatabaseConstraintError, flow);
    return flow;
}

a();

这会导致什么问题?如果我在链中分配一些内容并且它永远不会被解决,我担心这将是一个巨大的内存消费者。也许它会达到最大调用堆栈。我应该怎么解决这个问题?

1 个答案:

答案 0 :(得分:-1)

无休止地循环重试通常是一个坏主意,但仔细重试可能会间歇性失败的操作是合理的。

如何使用promise-retry这样的内容?它允许您重试承诺链一定次数。例如(来自文档):

promiseRetry(function (retry, number) {
    console.log('attempt number', number);

    return doSomething()
        .catch(retry);
})
.then(function (value) {
    // .. 
}, function (err) {
    // .. 
});

还有其他选择,或者你可以自己动手。

内存分配:只有在then()给出的回调中引用的任何东西一旦超出范围就会被垃圾收集,所以除非你不顾一切地收集每次迭代构建的对象,否则你应该没问题