2013-02-12 2 views
21

Я пишу код JS, который использует обещания. Например, я открываю всплывающее окно формы и возвращаю объект jQuery 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. 
    }); 
+0

Похоже на дизайнерское решение, которое идеально подходит в любом случае. –

+0

Я не думаю, что один метод лучше, чем другой, но я обычно связываю «сбой» с чем-то неправильным, например, исключение, а не выбранное значение, то есть неспособность выполнить обещание, а не выполнение обещания с определенным значением. –

+0

@ExplosionPills Да, вот что я пытаюсь получить. Поэтому я должен рассматривать отказ от обещания как ту же серьезность, что и исключение? – cdmckay

ответ

4

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

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

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

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

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

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

2

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

0

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

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

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


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

+0

Вам всегда нужен случай отказа, чтобы использовать обещание? – cdmckay

+0

Я думаю, нет, в зависимости от ситуации. –

+0

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

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