【问题标题】:Intercept $http request and return response without server request拦截 $http 请求并在没有服务器请求的情况下返回响应
【发布时间】:2017-03-17 00:12:12
【问题描述】:

我想在某些 http 请求上从内存中返回数据,而不是让它到达服务器。我知道我可以编写 http 拦截器,但我不确定如何从请求中实际返回响应?

myModule.factory('myHttpInterceptor', function ($q) {
    return {
        // optional method
        'request': function (config) {
            // return my data here [200], and stop the call from going through
            return config;
        }
    };
});

【问题讨论】:

  • 我们在工作中所做的是将 http 请求包装在一个总是返回一个 promise 的 cacheService 中。总之:return isCachedObject ? $q.resolve(cacheInstance) : return resultat from httpRequest。它可以成为您的选择吗?
  • @ÉricRoberge 是的,这将起作用,但希望有一个更优雅的解决方案 :) 也许没有!
  • 另一种选择是缓存 httpRequest 的承诺。因此,对同一请求的下一次调用可以绑定到第一次调用的承诺。
  • 我相信 Éric 的解决方案是您将获得的最优雅的解决方案。您可以在拦截器中取消请求,当请求被拒绝时,您可以使用 requestError 拦截器返回缓存数据而不是错误。这将在不使用包装器的情况下完成这项工作,但在我看来它不太优雅。

标签: angularjs http


【解决方案1】:

这是一个只使用拦截器的解决方案。我仍然认为 cmets 中的 Érics 解决方案更优雅,但现在您可以考虑不同的选择。

app.factory('myHttpInterceptor', function ($q, myCache) {
    return {
        request: function (config) {
            var cached = myCache.getCachedData(config.params);
            if(cached){
                return $q.reject({cachedData: cached, config: config });
            }
            return config;
        },

        response: function(response){
            // myCache.saveData(response.data);
        },

        responseError: function(rejection) {      
            if(rejection.cachedData){
                return $q.resolve(rejection.cachedData);
            }
            return $q.reject(rejection);
        }
    };
});

【讨论】:

    【解决方案2】:

    你可以查看这篇文章:Caching HTTP

    或者您可以使用$http 的缓存参数(查看更多角度documentation):

    $http.get('api/path',{
        cache: true
    }
    

    【讨论】:

    • 谢谢,但我不想以这种方式使用缓存。对于大数据,它会导致瓶颈。
    • 那么,检查第一个链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多