如何将这个延迟风格的承诺转换为 ES6 风格的承诺

How to convert this deferred style promise to ES6 style promise

参考菜鸟错误#4:在Nolan Lawson's article: We have a problem with promises中使用"deferred"(顺便说一句,很棒的post!),我尽量不不再使用延迟样式承诺。最近我遇到了一个实际的例子,我不知道如何不以延迟方式编码,所以我需要一些建议。

这是一个例子,一个 angular 工厂:

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提供一个ui小部件,其中包含两个按钮:确认取消。当点击确认时,调用_modalScope.confirm并解决延迟承诺,否则在取消[=36]时调用_modalScope.cancel拒绝延迟承诺=] 被点击。

我尝试用return $q(function(resolve, reject) { ... })重写,但我真的不知道how/when在这个构造函数中调用resolvereject,因为真正的逻辑在 _modalScope.confirm/cancel 方法中。我被这个问题困扰了好几天,真的希望有人能帮助我。

谢谢!

假设您问题中的代码可以正常运行并且 _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()
                }
            });
        }
    }
}