Как преобразовать это обещание отложенного стиля в обещание стиля ES6

Обратитесь к Ошибке новичка №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. Я боролся с этой проблемой в течение нескольких дней, очень надеюсь, что кто-то может мне помочь.

Спасибо!


person nightire    schedule 27.06.2015    source источник
comment
На самом деле вы не используете здесь отложенный антишаблон, потому что $modal уже не является обещанием API. Deferred'ы прекрасно подходят для многообещающих вещей!   -  person Bergi    schedule 27.06.2015
comment
@ Берги, о, честно говоря, я этого не осознавал, спасибо!   -  person nightire    schedule 27.06.2015


Ответы (1)


Если предположить, что код в ваших вопросах функционален и _modalScope доступен из функции _showModal(), то приведенный ниже код должен ответить на ваш вопрос:

function ConfirmModal($q, $modal) {
    return {
        showModal: function _showModal(options) {
            return $q(function(resolve, reject) {
                var _modal = $modal(options)

                _modalScope.confirm = function(result) {
                    resolve(result)
                    _modal.hide()
                }

                _modalScope.cancel = function(reason) {
                    reject(reason)
                    _modal.hide()
                }
            });
        }
    }
}
person JME    schedule 27.06.2015
comment
Я пробовал это раньше и думал, что это не работает, и я попробовал еще раз, прочитав ваш ответ, это действительно работает! Я думал, что это не работает, потому что angular выдает ошибку, но я невнимательно прочитал, оказалось, что ошибка не связана с этой модификацией, мой плохой. Большое тебе спасибо. - person nightire; 27.06.2015
comment
Не будет работать с Angular 1.2. Не уверен насчет Angular 1.3. Кажется, работает с Angular 1.4 и 1.5. - person Harry Pehkonen; 20.04.2016