6

请参阅Nolan Lawson的文章中的新手错误 #4:使用“延迟”:We have a problem with promises(顺便说一句,这是一篇很棒的文章!),我尽量不再使用延迟样式的 promises。最近我遇到了一个实际示例,我无法弄清楚如何不以延迟方式对其进行编码,所以我需要一些建议。

这是一个例子,一个角度工厂:

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 小部件:ConfirmCancel单击Confirm时,调用_modalScope.confirm并解决延迟的 Promise,否则单击Cancel_modalScope.cancel时通过调用来拒绝延迟的Promise。

我试图通过 using 重写return $q(function(resolve, reject) { ... }),但我真的不知道如何/何时在这个构造函数中调用resolvereject,因为真正的逻辑在_modalScope.confirm/cancel方法中。我为这个问题苦苦挣扎了好几天,真的希望有人能帮助我。

谢谢!

4

1 回答 1

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()
                }
            });
        }
    }
}
于 2015-06-27T15:38:28.233 回答