Использование обещаний CommonJS: отклонение против исключений - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть функция, downloadAsync(), которая возвращает обещание CommonJS (используя Q ). Может произойти сбой двумя способами:

  1. Файл уже может быть загружен, и в этом случае мы сразу узнаем.
  2. Процесс загрузки может завершиться неудачей, и в этом случае мы узнаем некоторое время спустя.

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

Мой вопрос: должен ли мой API быть единообразным и всегда сигнализировать об ошибке, отклоняя обещание? Или я должен бросить исключения для немедленно определяемых условий недопустимого состояния? В качестве другого примера, если бы пользователь передал мне неверный аргумент, было бы гораздо разумнее выдать ошибку, чем отклонить обещание.

Также было бы неплохо прояснить, насколько «исключительным» является отказ от обещания; соответствует ли использование «один-к-одному» правилам использования исключений, или мы также используем его для неисключительных сбоев?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Если вы хотите знать, что вы должны делать, когда ваша функция (которая реализует Q) должна делать, когда представлен неверный ввод, который может быть обнаружен синхронно, я посмотрел исходный код для Q, чтобы увидеть, что сделал Q.

Вот пример.

if (fallback === undefined) {
    fallback = function (op) {
        return reject("Promise does not support operation: " + op);
    };
}

Когда Q представлен с неверным вводом, Q вызывает распознаватель с объектом отклонения.Поэтому вы могли бы оправдаться, если бы ваш API вел себя аналогично, а не пытался изменить поведение базовой библиотеки.

Плюс, взгляните на это с точки зрения любого, кто использует ваш API.Они хотят разработать и поддерживать два пути кода для обработки исключений или один?

0 голосов
/ 19 сентября 2011

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

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

...