gpt4 book ai didi

angularjs - Restangular - 如何覆盖错误拦截器

转载 作者:行者123 更新时间:2023-12-04 09:59:50 27 4
gpt4 key购买 nike

我正在使用 AngularJS v1.2.16 Restangular v1.4.0 ,并想知道是否可以覆盖 ErrorInterceptor。如果是,如何?如果没有,我该如何解决?

我已经配置了一个这样的错误拦截器:

RestangularProvider.setErrorInterceptor(
function ( response ) {
if ( response.status == 401 ) {
dialogs.error("Unauthorized - Error 401", "You must be authenticated in order to access this content.")
.result.then( function () {
$location.path("/login");
});
}
else {
// Some other unknown Error.
console.log( response );
dialogs.error(response.statusText + " - Error " + response.status,
"An unknown error has occurred.<br>Details: " + response.data);
}
// Stop the promise chain.
return false;
}
);

然后,在另一个地方,我使用错误处理进行 POST 调用。
function saveApple( apple ) {
Restangular.all("apple/save").post( apple ).then(
function ( response ) {
console.log("Saved");
},
function ( response ) {
// This is not being called.
console.log("Error with status code", response.status);
}
);
}

我明白,我的“第二个”错误处理程序没有被调用,因为我正在返回 falseErrorInterceptor .

但是我该如何解决这个问题?我的应用程序中有很多“REST 操作”,但只有少数几个,我想要在出现问题时自定义行为。

到目前为止,我想到的唯一解决方法是制作 ErrorInterceptor返回 true ,对于其他所有 REST 操作,我复制粘贴相同的错误处理程序(更通用的错误处理程序)。但这将是我要做的最后一件事。

眼下,是这样流淌的:
  • 错误拦截器 > 结束。

  • 如果可能,我希望它是这样的:(仅针对特定方法 - 并非全部)。
  • ErrorInterceptor > Especific_ErrorHandler(如果存在)> End。

  • 它也可以是这样的:
  • Especific_ErrorHandler(如果存在)> ErrorInterceptor > End。

  • 无论哪种方式都适合我。

    引用:

    https://github.com/mgonto/restangular#seterrorinterceptor
    https://github.com/mgonto/restangular#how-can-i-handle-errors

    提前致谢!

    最佳答案

    这是你的代码:

    RestangularProvider.setErrorInterceptor(
    function ( response ) {
    if ( response.status == 401 ) {
    dialogs.error("Unauthorized - Error 401", "You must be authenticated in order to access this content.")
    .result.then( function () {
    $location.path("/login");
    });
    }
    else {
    // Some other unknown Error.
    console.log( response );
    dialogs.error(response.statusText + " - Error " + response.status,
    "An unknown error has occurred.<br>Details: " + response.data);
    }
    // Stop the promise chain.
    return false;
    }
    );

    你为什么使用拦截器?
    - 因为您需要全面的对话框来显示错误消息。

    停止 promise 链,这是不好的做法吗?

    我不知道。许多人使用错误回调;错误回调的一个用例是进行一些清理。如果你杀死 promise 链,你如何确保清理完成?停止 promise 链意味着你的错误回调,你的 catch块和您的 finally块不会被调用。

    在文档中,清理完成,您可以看到 deferred.reject被传递。
    https://github.com/mgonto/restangular#seterrorinterceptor
    也许您误解了文档中的示例。

    可能的解决方案#1
            // DON'T stop the promise chain.
    return true;

    可能的解决方案#2

    不要在错误拦截器中处理未知错误。
    RestangularProvider.setErrorInterceptor(
    function ( response ) {
    if ( response.status == 401 ) {
    dialogs.error("Unauthorized - Error 401", "You must be authenticated in order to access this content.")
    .result.then( function () {
    $location.path("/login");
    });
    // Stop the promise chain.
    // all unauthorized access are handled the same.
    return false;
    }
    // Some other unknown Error.
    console.log( response );
    dialogs.error(response.statusText + " - Error " + response.status,
    "An unknown error has occurred.<br>Details: " + response.data);
    }
    // DON'T stop promise chain since error is not handled
    return true;
    }
    );

    可能的解决方案 #3

    调用 reject当你停止 promise 链时。
    RestangularProvider.setErrorInterceptor(
    function ( response, deferred, responseHandler ) {
    if ( response.status == 401 ) {
    dialogs.error("Unauthorized - Error 401", "You must be authenticated in order to access this content.")
    .result.then( function () {
    // continue promise chain in this callback.
    deferred.reject("unauthorized");
    $location.path("/login");
    });
    // Stop the promise chain here
    // all unauthorized access are handled the same.
    return false;
    }
    // Some other unknown Error.
    console.log( response );
    dialogs.error(response.statusText + " - Error " + response.status,
    "An unknown error has occurred.<br>Details: " + response.data);
    }
    // DON'T stop promise chain since error is not handled
    return true;
    }
    );

    关于angularjs - Restangular - 如何覆盖错误拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010548/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com