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

标签 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 的第二个更新函数也是一项服务。我想让它返回一个 promise ,以便它可以被链接起来。

如您所见,ServerErrorAlert 只是一个便利函数。我没有在服务中定义延迟,而是希望它能够识别它。然而,事实并非如此,服务不识别延迟。

我想我只是感到困惑,因为如果我用服务的返回值(即函数定义)替换 $update 中的 ServerErrorAlert 参数,我相信它会识别延迟。为什么方法提取出来后就认不出来了?

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

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

提前致谢。

最佳答案

简单地返回一个被拒绝的 promise ,例如

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

我还会改变您解决资源 promise 的方式。您实际上并不需要创建自己的延迟对象。试试这个...

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

关于javascript - 服务方法无法识别外部定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227634/

相关文章:

javascript - Uglify 无法与 Grunt Watch 配合使用

javascript - 使用 angularjs 导入 Google 联系人

angularjs - LoopbackJS:HasAndBelongsToMany,如何按关系的属性查询/过滤?

java - 让 Play 框架和 Angular 一起工作的最佳方式

AngularJs Controller ,等待服务 $http 结果

JavaScript 用 Base64 替换 Textarea 文本

javascript - 如何在事件上对 jquery 进行指令更新 ng-model?

javascript - Angular 服务不过滤数据

javascript - 按钮在按下时更改名称

javascript - AngularJS 通过模板在组件之间进行通信(带有 promise )