2016-11-19 3 views
1

У меня есть ряд функций, хранящихся в массиве. В основном у меня есть два вопроса.Цепочные обещания, но продолжайте со следующего обещания, когда один не удается (и зарегистрируйте отклонение)

  1. Как превратить этот массив функций в прикованные обещания. (Длинный массив) Что-то в линиях: funcs.reduce((prev, cur) => prev.then(cur), starting_promise);
    или
    var promise = funcs[0](input); for (var i = 1; i < funcs.length; i++) promise = promise.then(funcs[i]);

  2. (это главный вопрос) будет, как обещание цепи не отказываться, когда один из обещаний в цепи брака. Но вместо этого продолжать дальше следующего, пока не достигнет последнего. (Если это возможно, также ловя отказ, так что я может выводить то, что пошло не так)

ответ

2

Вы можете обрабатывать отказ в пределах reduce обратного вызова;

funcs.reduce((prev, cur) => prev.then(cur).catch(log), starting_promise) 

Или вы могли бы предварительно обработать массив функций:

funcs.map(f => v => f(v).catch(log)) 
    .reduce((prev, cur) => prev.then(cur), starting_promise) 

В любом случае, дело в том, что catch не ставит обещание вернуться на путь успеха, как это было (если вы бросить внутрь обработчик уловов).

Обратите внимание, что независимо от того, что возвращается обработчик catch, становится входным значением следующей функции в цепочке обещаний. Если вы хотите причину отклонения стать вход, а затем вернуть его из catch обработчика:

function log(reason) { 
    console.log("rejected with reason", reason, "continuing..."); 
    return reason; 
} 

Из комментария:

Как использовать ссылку текущ в улове -> войти функцию ?

Вместо того, чтобы просто проездом log к catch, передать функцию, которая вызывает log как с разумом и функции:

funcs.reduce(
    (prev, cur) => prev.then(cur).catch(reason => log(reason, cur)), 
    starting_promise) 

function log(reason, func) { 
    console.log("rejected with reason", reason, "in function", func, "continuing..."); 
    return reason; 
} 
+0

@Phoelpis Remember, 'cur' это не обещание, а функция, которая возвращает обещание. Возможно, вы имеете в виду, что хотите передать причину отклонения обещания, вызванного вызовом 'cur' функции' log'? Ну, на самом деле это уже будет. Извините, если я не понял ваш вопрос. –

Смежные вопросы