2014-01-21 2 views
53

Это, наверное, глупый вопрос, но средняя цепочка обещаний, как вы отвергаете обещание изнутри одной из функций? Например:Как отклонить обещание изнутри, тогда функция

someActionThatReturnsAPromise() 
    .then(function(resource) { 
     return modifyResource(resource) 
    }) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) { 
      var validationError = getValidationError(modifiedResource); 
      // fail promise with validationError 
     } 
    }) 
    .catch(function() { 
     // oh noes 
    }); 

Больше нет ссылки на оригинальную функцию разрешения/отклонения или PromiseResolver. Я просто должен добавить return Promise.reject(validationError);?

+1

бросить исключение? – thefourtheye

+1

'throw validationError' – kavun

+0

><У меня было ощущение, что это будет что-то глупое/легкое. Думаю, я продолжал думать, что я должен был вызвать функцию отклонения или вернуть неудачное обещание. Итак, изнутри обещания/thenable, любое возвращаемое значение, которое не является новым обещанием, будет считаться разрешенным значением? И если я ошибаюсь, это то же самое, что и возвращение немедленно отклоненного обещания? Если вы опубликуете это в качестве ответа, я соглашусь с ним. – chinabuffet

ответ

62

Я просто должен добавить return Promise.reject(validationError);?

Да. Однако, it's that complicated только в JQuery, с Promise/A+ -совместимыми библиотеками вы также можете просто

throw validationError; 

Так что ваш код будет выглядеть

someActionThatReturnsAPromise() 
    .then(modifyResource) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) 
      throw getValidationError(modifiedResource); 
     // else ! 
     return modifiedResource; 
    }) 
    .catch(function() { 
     // oh noes 
    }); 
+0

Это обычная вещь? Широко используется? Я плохо себя чувствую, потому что если где-то в коде '.catch' отсутствует, ** ** приложение ** будет взорваться с нечеткой ошибкой. –

+2

Обратите внимание, что в библиотеке, совместимой с Promise/A +, вы можете использовать throw, потому что 'handler' для' then' является синхронизацией, и исключение можно поймать. Если обработчик является асинхронным, он должен вернуть обещание в конце концов отклонить. Поэтому всегда возвращать Promise.reject() вместо бросания имеет смысл для меня. Поскольку, если вы выбрали обработчик async, библиотека не сможет его поймать, и он будет молча проходить. Осторожно. –

+1

@MikeGleasonjrCouturier: не должно быть обработчиков async, которые не являются обработчиками '. Then' на обещании :-) Если вы используете не обещанный API, тогда даже' return Promise.reject() 'вам поможет. – Bergi

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