Когда я должен отказаться от обещания?

Я пишу код JS, который использует promises. Например, я открываю всплывающее окно формы, и я возвращаю объект jQuery Deferred. Он работает следующим образом:

  • Если пользователь нажимает кнопку "ОК" в форме и проверяет ее, Deferred разрешает объект, представляющий данные формы.

  • Если пользователь нажимает кнопку "Отмена", то "Отложенное" разрешает нулевое значение.

Что я пытаюсь решить, должен ли Deferred вместо этого отклонять, а не разрешать? В более общем плане, мне интересно, когда мне нужно разрешить что-то вроде нулевого объекта, и когда я должен отклонить?

Вот пример кода, демонстрирующего две позиции:

// Resolve with null.
var promise = form.open()
    .done(function (result) {
        if (result) {
            // Do something with result.
        } else {
            // Log lack of result.
        }
    });

// Reject.
var promise = form.open()
    .done(function (result) {            
        // Do something with result.            
    })
    .fail(function () {
        // Log lack of result.
    });

Ответ 1

Семантика ваших двух стратегий на самом деле не одинакова. Явное отклонение отложенного значения имеет смысл.

Например, $. when() будет продолжать накапливать результаты, пока отложенные объекты передаются успешно, но выйдет первый, который не работает.

Это означает, что если мы переименуем ваши два promises promise1 и promise2 соответственно:

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});

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

Однако этот код не будет ждать завершения первой формы перед вызовом обратного вызова отказа, если вторая форма отменена.

Ответ 2

Поскольку он управляется пользователем, я бы не рассматривал его как "отказ". Первый вариант кажется более чистым.

Ответ 3

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

var promise = form.open()
.done(function (result) {            
    // Do something with result.            
})
.fail(function () {
    // Log lack of result.
})
.always(function() {
    // close the form.
})

Если вы не отказываетесь от отмены, когда вы вообще отказываетесь? в этот момент, зачем использовать отложенный объект? Вы можете отклонить ошибку ввода, но тогда вам придется сгенерировать совершенно новое обещание, если вы захотите, чтобы они исправили его.


Отсрочки действительно не кажутся правильными для использования здесь. Я просто использовал события.