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

service method does not recognize variable defined outside

这是一项服务:

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 的第二个更新函数也是一个服务。我想让它 return 一个承诺,这样它就可以被链接起来。

如您所见,ServerErrorAlert 只是一个方便的功能。我没有在服务中定义延迟,而是希望它能识别它。然而事实并非如此,deferred是服务无法识别的。

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

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

我怎样才能完成我想完成的事情?

提前致谢。

只是return一个被拒绝的承诺,例如

.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);