Обратитесь к Ошибке новичка №4: использование слова deferred в статье Нолана Лоусона: У нас проблема с обещаниями (кстати, отличный пост!), я стараюсь не использовать промисы отложенного стиля больше. Недавно я столкнулся с практическим примером, в котором я не могу понять, как НЕ кодировать это отложенным способом, поэтому мне нужны некоторые советы.
Вот пример, угловая фабрика:
function ConfirmModal($q, $modal) {
return {
showModal: function _showModal(options) {
var _modal = $modal(options)
var deferred = $q.defer()
_modalScope.confirm = function(result) {
deferred.resolve(result)
_modal.hide()
}
_modalScope.cancel = function(reason) {
deferred.reject(reason)
_modal.hide()
}
return deferred.promise
}
}
}
Я скрываю некоторые несвязанные детали (например, реализацию _modalScope
), основная идея заключается в следующем: $modal
предоставить виджет пользовательского интерфейса, который содержит две кнопки: Подтвердить и Отмена. При нажатии Подтвердить вызовите _modalScope.confirm
и разрешите отложенное обещание, в противном случае отклоните отложенное обещание, вызвав _modalScope.cancel
при нажатии Отмена.
Я пытался переписать с помощью return $q(function(resolve, reject) { ... })
, но я действительно не знаю, как/когда вызывать resolve
и reject
в этом конструкторе, потому что настоящая логика находится в методе _modalScope.confirm/cancel
. Я боролся с этой проблемой в течение нескольких дней, очень надеюсь, что кто-то может мне помочь.
Спасибо!
$modal
уже не является обещанием API. Deferred'ы прекрасно подходят для многообещающих вещей! - person Bergi   schedule 27.06.2015