Ответ 1
Построение асинхронных API с ошибками
Да, точка Promise.method
заключается в том, чтобы сделать методы безопасными - например, если у вас есть метод, который выглядит так:
function foo(jsonStr){
var obj = JSON.parse(jsonStr);
return getApi(obj.endpoint);
}
Может быть throw
ошибка, если передана недопустимый объект, поэтому, если вы передадите ей недопустимую строку, она будет метать (а не отклонять). Это означает, что вы должны защищать как отброшенные ошибки, так и отклоненные promises в своем коде и добавлять в свой код } catch(e){
и .catch(function(e){
.
Эта форма программирования создает слабый и хрупкий API, который отличает синхронные и асинхронные ошибки и может (и будет) создавать условия гонки, основанные на ошибках. Если функция может делать что-то асинхронно, она всегда должна делать это асинхронно. Это основная концепция разработки асинхронных API-интерфейсов - в противном случае вы столкнетесь с условиями гонки и другими проблемами.
Что Promise.method
делает
Promise.method
в основном обертывает ваш метод с помощью try/catch и преобразует брошенные ошибки в отклонения и возвращает значения для выполнения. Если ваш function foo
был Promise.method
, он всегда отказывался бы от ошибок, а не отбрасывания. Это устраняет проблему состояния гонки, так как ваши методы теперь всегда терпят неудачу одинаково.
var foo = Promise.method(function(jsonStr){
var obj = JSON.parse(jsonStr); // if this throws - you get a rejection
return getApi(obj.endpoint);
});
Если не использовать его
Есть случаи, когда вы можете избежать использования Promise.method
- например, когда тело вашего метода находится в цепочке обещаний или вы на 100% уверены, что оно не будет выбрано. В общем, я нахожу Promise.method
весьма полезным.
Он также имеет дополнительное преимущество, позволяя вам возвращать простые значения из методов возврата обещаний и поддерживать их последовательно.
Итак, следует ли обертывать функции, возвращающие с ним promises?
В общем - да. Исключения применяются и YMMV.