2016-01-08 2 views
0

Когда я поймаю исключение в обещании, можно ли просто повторить обещание или это называется анти-шаблон? Я знаю, что исключения не должны выступать в роли директоров потоков, но я не могу найти другого решения моей проблемы. Рассмотрим этот код:Повторить цепочку обещаний по ошибке

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

a(); 

Какие проблемы могут это приведет? Я боюсь, что это будет огромный потребитель памяти, если я что-то выделяю в цепочке, и он никогда не будет разрешен. Возможно, он попадет в максимальный стек вызовов. Как мне это решить?

+0

Я думаю, что у вас есть проблема с '.catch' - в 99,99% библиотек Promise,' .catch' принимает (ну, использует, вы можете передавать столько, сколько хотите, их игнорируют) только ** one ** аргумент –

ответ

-1

Бесконечные повторения циклов, как правило, являются плохими идеями, но тщательно повторять операцию, которая может прерываться с ошибкой, является разумной.

Как насчет использования чего-то вроде promise-retry? Это позволяет вам повторять цепочку обещаний определенное количество раз. Например (из документов):

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

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

Существуют и другие альтернативы, или вы можете свернуть самостоятельно.

Распределение памяти: все, что упоминается только в обратном вызове, присвоенное then(), будет собираться с мусором, если оно выходит за рамки, поэтому, если вы не сойдете с пути, чтобы собирать объекты, построенные на каждой итерации, вы должны быть в порядке.