如何将此延迟样式承诺转换为ES6样式承诺

nig*_*ire 6 javascript deferred angularjs es6-promise

参考Rookie的错误#4:Nolan Lawson的文章中使用"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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我隐藏了一些不相关的细节(例如实现_modalScope),核心思想是:$modal提供一个包含两个按钮的ui小部件:确认取消.当确认是被点击,调用_modalScope.confirm和解决延期的承诺,否则通过调用拒绝延期的承诺_modalScope.cancel时,取消是被点击.

我试图通过使用重写return $q(function(resolve, reject) { ... }),但我真的不知道如何/何时调用resolvereject在这个构造函数中,因为真正的逻辑在_modalScope.confirm/cancel方法中.几天我一直在努力解决这个问题,真的希望有人可以帮助我.

谢谢!

JME*_*JME 5

假设您的问题中的代码_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()
                }
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)