2015-10-14 3 views
0

Я немного смущен, когда ошибка в обещании передается обработчику уловов.Возвращение обещания и ошибка

С нижеследующим разрядом кода, если promise2 вызывает ошибку, передается ли это улову внизу? Кроме того, мой возврат внутри первого «затем» возвращает promise2 в качестве обещания или возвращает doc.

promise1(foo).then(doc =>{ 
    return promise2(doc).then(doc => { 
    return doc 
    }) 
}).then(doc =>{ 
    console.log(doc) 
}).catch(err => { 
    console.error(err) 
}) 

Приветствия

ответ

0

then может вернуть обещание, но если что-то не нужно явно возвращать отбраковки. В приведенном ниже примере changedDoc передается на второй then, как newDoc

promise1(foo).then(doc =>{ 
    // changedDoc = doc..... 
    if (good things happened) { 
    return changedDoc; 
    } else { 
    return new Promise.reject("error"); 
    } 
}).then(newdoc =>{ 
    console.log(newdoc) 
}).catch(err => { 
    console.error(err) 
}) 
+2

'явно возвращать отклонение 'или' бросать' ошибку –

+0

Да ... но точка Обещает, что она использует свою монадическую структуру, чтобы избежать необходимости «бросать» –

0

then может принимать два параметра:

  • один для случая, когда обещание выполнено
  • другой для случая, когда обещание отклоняется (целенаправленно или из-за исключения было исключено)

Если есть ошибка при выполнении t он код, либо в заполненном, либо отклоненном, выполнение будет продолжено в следующем отклоненном обратном вызове. В вашем коде первый отклоненный обратный вызов - это тот, который указан в обратном вызове catch. Если этого блока не существовало, исключение будет продолжать пузыриться до первого блока catch в коде. И, если бы не было такого блока, он был бы обработан браузером и отображался как ошибка для пользователя.

Если вас look at the documentation, вы увидите, что catch точно так же как then, который принимает только второй параметр:

Promise.prototype.then(onFulfilled, onRejected) 

Promise.prototype.catch(onRejected) 

Вы также можете посмотреть на this documentation on handling exceptions with promises.

Вся идея обещаний быть в состоянии цепи, то, таким образом, что Сукчес распространяется на onFullfilled обратный вызов, который может работать без ошибок, и вернуть что-то для следующего onFullfilled обработчика, или запустить с ошибкой, с будет обрабатывается следующим onRejected. Ошибка может быть целенаправленным отказом или необработанным исключением.

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