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

Javascript 服务方法无法识别外部定义的变量,javascript,angularjs,angular-promise,angular-resource,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.re

以下是一项服务:

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只是一个方便的功能。我没有在服务中定义deferred,而是希望它能够识别它。但是,情况并非如此,服务不识别延迟

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

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

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


提前感谢。

只需回复被拒绝的承诺,如

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

我是这样称呼它的
。在哪里?未显示上下文。
延迟
不在工厂功能的范围内。相反,return
$q.reject(errorResponse)
@charlietfl Hi charlietfl,$update是一个异步http请求,它将错误回调作为第二个参数。这里,我将ServerErrorAlert作为第二个参数传递,从而导致在从服务器收到错误响应后调用它。你能看看原来的帖子吗。我用所有的代码(调用服务的地方)编辑了它。我需要在这里定义延迟。@pQuestions123我已经假设你有这个问题,并在我的答案中涵盖了它。嗨,菲尔,对不起,我直到现在才有时间真正查看你的答案。我想我还不够清楚。我不确定您是否熟悉$update,但它是angular resource模块的一部分,是一个http请求。第二个调用函数实际上本身就是一个服务,我也希望返回一个承诺。这样,调用第二个服务的控制器就可以调用服务。那么我想我不明白你答案的第一部分。通过从ServerErrorAlert返回新的拒绝,我能得到什么?它没有异步调用。。。。我所要做的就是拒绝第一个承诺(由第一个具有异步调用的服务返回)。@pQuestions123我非常熟悉
$resource
。像
$update
这样的非GET实例方法返回一个承诺,因此不需要创建新的延迟对象(正如我在回答中提到的)。在
ServerErrorAlert
中返回新拒绝与调用
deferred相同。如果
deferred
在范围内,则拒绝。