2015-04-14 2 views
4

Here рекомендуются, чтобы закончить обещает цепочку с проделанными методами ошибки быть повторно брошено:сделан() на использовании Обещания/А + спецификации в угловом

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

Применяется к AngularJs? Я посмотрел и, похоже, такого метода не существует.

UPDATE:

Я принял взглянуть на код и нашел следующее:

try { 
    if (isFunction(fn)) { 
     promise.resolve(fn(state.value)); 
    } else if (state.status === 1) { 
     promise.resolve(state.value); 
    } else { 
     promise.reject(state.value); 
    } 
} catch (e) { 
    promise.reject(e); 
    exceptionHandler(e); 
} 

window.onerror = function(e) { 
    // doesn't come here 
} 

Так в основном угловой дополнительно регистрирует ошибку из обработчика посыла в exceptionHandler(e); поэтому он не Оставайтесь незамеченными. Если необходимо, поведение по умолчанию exceptionHandler может быть перечеркнуто, как описано here.

ответ

1

done() метод на Обещания/A + спецификация

Обратите внимание, что Обещает ли указать только then, это ничего не говорит о done.

Q recommends ... Как насчет использования в угловом?

Q не $q! Существует нет метода done по реализации обещаний Angular, поэтому я бы рекомендовал не использовать его.

Золотые правила Q не относятся к Угловому, они имеют в значительной степени разные функции.


Обещание является асинхронным, так что вы не можете использовать try catch заявления вокруг обратных вызовов. done используется для выброса неустранимого, неуловимого в окружающую среду (так будет вызываться window.onerror или process.onuncaughtexception).

Если вы хотите, чтобы поймать исключения, вы должны использовать метод catch с обратным вызовом:

$q.reject(new Error()).catch(function(e) { 
    console.log("does catch an error"); 
}); 

Чтобы поймать необработанное отказов (в конце ваших сулят цепей), вы также можете использовать $exceptionHandler.

+0

Спасибо, так что нет способа поймать ошибку, брошенную внутри обработчика 'catch', как показано в моем обновлении? И так как «$ exceptionHandler» углового 'ловит ошибки, выброшенные внутри обещаний (которые, согласно спецификации, потребляются в рамках обещаний), ошибка не останется незамеченной, верно? –

+0

Да, мой пример недействителен, извините, не подумал. Идея состоит в том, что если исключение происходит внутри обратного вызова 'c' здесь' .catch (c) ', без' done() 'это исключение не будет сообщаться в не угловом приложении в соответствии с документами' Q' и останется незамеченным, верно? –

+0

@Maximus: Да, он просто отверг бы обещанное обещание. Что может быть или не быть незамеченным (только в конце цепи обещаний). – Bergi

1

Углового использование $ д, который:

реализация обещаний/отсроченные объекты вдохновленных Q. Kris Коваля в

Вы должны использовать the Promise API представлены в угловой документации: .finally() , .then() и .catch().

Угловые описывает такую ​​разницу довольно хорошо:

Q имеет гораздо больше возможностей, чем $ д, но это происходит в стоимости байт. $ q является крошечным, но содержит все важные функции, необходимые для общих задач async.

Так выглядит, что нет .done() в $ q.

Надеюсь, что он отвечает на ваш вопрос.

1

В дополнение к ответу sebastienbarbier, угловая служба $ q также привязана к циклу $ digest (который угловой пробегает внутри) и который (для $ q) выполняет функцию .done() в Q. Криса Коваля.

Это может вас поймать в тестах, где $ scope.digest() гарантирует, что обещания полностью решены.

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