service方法无法识别外部定义的变量

时间:2015-05-14 01:01:26

标签: javascript angularjs angular-promise angular-resource

这是一项服务:

angular.module('core').factory('ServerErrorAlert', ['toaster',
    function(toaster) {
        return function(errorResponse) {
            toaster.pop('error', 'Error', errorResponse);
            if (deferred) {
                deferred.reject(errorResponse);
            }
        }
    }
]);

以下是我的称呼方式:

function update(updatedTransaction, originalTransaction, updateLocal) {
            var deferred = $q.defer();
            updatedTransaction.$update(function() {
                if (updateLocal) {angular.extend(originalTransaction, updatedTransaction);}
                deferred.resolve(updateLocal ? originalTransaction : false);
            } , ServerErrorAlert);
            return deferred.promise;
        };

调用ServerErrorAlert的第二个更新函数也是一个服务。我希望它能够返回一个承诺,以便它可以被链接。

正如您所看到的,ServerErrorAlert仅仅是一个便利功能。我没有在服务中定义延迟,而是希望它能识别它。但是,情况并非如此,延迟服务无法识别。

我想我只是感到困惑,因为如果我将$ update中的ServerErrorAlert参数替换为服务的返回值,即函数定义,我相信它会识别延迟。一旦提取方法,为什么它不能识别它?

基本上,我希望ServerErrorAlert处理$ resource调用引起的所有服务器错误,但我不想将复制和粘贴函数定义作为错误回调。相反,我希望只在那里粘贴一个单词(代码重用)。

我如何完成我想要完成的任务?

提前致谢。

1 个答案:

答案 0 :(得分:1)

只需返回被拒绝的承诺,例如

.factory('ServerErrorAlert', ['$q', 'toaster', function($q, toaster) {
    return function(errorResponse) {
        toaster.pop('error', 'Error', errorResponse);
        return $q.reject(errorResponse);
    }
}]);

我也会改变您解决资源承诺的方式。您并不需要创建自己的延迟对象。试试这个......

return updatedTransaction.$update().then(function() {
    if (updateLocal) { // assuming this is actually defined and in scope
        angular.extend(originalTransaction, updatedTransaction);
        return originalTransaction;
    }
    return false;
}, ServerErrorAlert);