如何在Angular应用程序中同步HTTP请求?

米哈伊尔·科皮洛夫(Mikhail Kopylov)

我已经实现了具有方法get(url)的cacheService,该方法从HTTP获取值,将其放入localStorage并返回$ q promise。在下一个.get(url)运行时,它从localStorage获取值,并返回用$ q包裹的值。

function get(url){
    var saved = JSON.parse(localStorage.getItem(url));
    if (angular.isObject(saved)){
        return $q.when(saved);
    }
    return $http.get(url).then(function(xhr){
        localStorage.setItem(url, JSON.stringify(xhr.data));
        return xhr.data;
    });
}

这是我的方法不起作用的情况-它发出多个HTTP请求。

如果我两次调用cacheService.get(url)(例如从不同的模块):

  • 第一次运行时,在localStorage中找不到缓存值并发出HTTP请求
  • 当它在第一个请求之后第二次运行时,第一个HTTP请求尚未完成,其结果值尚未缓存。所以我的方法使HTTP请求第二次。

而且我不喜欢它。

所以问题是:

如何通过url同步请求以使每个url仅具有1个请求?

UPD:我有个主意:

  • 定义 var currentRequests = {};
  • 如果localStorage具有缓存的值,则返回1
  • 如果currentRequests[url]为空,则执行请求并设置currentRequests[url] = $http.get(url)-将诺言存储在
  • 如果currentRequsts[url]不为空,则此请求正在运行,然后return currentRequests[url]

由于JS在浏览器的单个线程中运行,因此currentRequests是线程安全的。但这不在nodejs中。正确的?

你怎么看待这件事?

港区

这可能不是一个好的解决方案。但您可以尝试一下。

我建议您保持承诺。

var promiseArr = [];
function get(url){
    var saved = JSON.parse(localStorage.getItem(url));
    if (angular.isObject(saved)){
        return $q.when(saved);
    }
    //check if $http request for the url has a pending promise.
    if(!promiseArr.hasOwnProperty(url)){          
      promiseArr[url] = $http.get(url).then(function(xhr){
          localStorage.setItem(url, JSON.stringify(xhr.data));
          delete promiseArr[url]; //Delete the promise once resolved.. please check.
          return xhr.data;
      });
    }
    return promiseArr[url]; //return the promise from the array.   
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java Spring应用程序中缓存使用Netflix的Feign库发出的HTTP请求

来自分类Dev

您如何在EmberJs应用程序中“拦截”所有HTTP请求?

来自分类Dev

如何在Laravel Vapor应用程序中获取HTTP请求的IP?

来自分类Dev

如何在Front Controller Web应用程序中处理Http请求竞争条件?

来自分类Dev

如何让 Angular js $http.delete 请求在图像应用程序中工作

来自分类Dev

如何在我的应用程序Angular 9中限制API请求

来自分类Dev

如何在NextJS应用程序中从Apollo链接上下文访问Express HTTP请求?

来自分类Dev

如何在Angular应用程序中隐藏损坏的图像

来自分类Dev

如何在Azure上的多个实例Web应用程序中同步服务器操作?

来自分类Dev

如何在Windows 8应用程序中同步显示MessageDialog?

来自分类Dev

如何在嵌入Grizzly的Jersey应用程序上获取HTTP请求方法?

来自分类Dev

如何在Angular js中进行同步http请求

来自分类Dev

区分应用程序对$ http的调用和Angular在拦截器中对静态资源的请求

来自分类Dev

当通过在Android中刷卡杀死应用程序时,如何调用Web服务(Http请求)?

来自分类Dev

如何解决来自 Node.js 应用程序的外部 HTTP 请求中的错误

来自分类Dev

如何在JavaScript中执行同步HTTP请求

来自分类Dev

如何在单页 Web 应用程序中处理 node.js 中的“发布”请求

来自分类Dev

如何检查单个应用程序的传出HTTP请求?

来自分类Dev

在R Shiny应用程序中接受HTTP请求

来自分类Dev

在应用程序的onStop中在android中发送http请求

来自分类Dev

Spring RESTful 应用程序中的 HTTP POST 请求

来自分类Dev

如何在Silex应用程序中避免超出请求范围的异常?

来自分类Dev

如何在Windows 10 Preview中安装应用程序请求路由ARR 3.0?

来自分类Dev

如何在Android应用程序中请求特定的文本大小?

来自分类Dev

Rails:如何在仅API应用程序中暂停请求周期?

来自分类Dev

我如何在React应用程序中向API发出一百万个以上的请求?

来自分类Dev

仅在请求Servlet时如何在Tomcat中初始化Web应用程序

来自分类Dev

如何在基于EJB的Web应用程序中过滤请求?

来自分类Dev

如何在整个应用程序中维护请求队列的单个实例

Related 相关文章

  1. 1

    如何在Java Spring应用程序中缓存使用Netflix的Feign库发出的HTTP请求

  2. 2

    您如何在EmberJs应用程序中“拦截”所有HTTP请求?

  3. 3

    如何在Laravel Vapor应用程序中获取HTTP请求的IP?

  4. 4

    如何在Front Controller Web应用程序中处理Http请求竞争条件?

  5. 5

    如何让 Angular js $http.delete 请求在图像应用程序中工作

  6. 6

    如何在我的应用程序Angular 9中限制API请求

  7. 7

    如何在NextJS应用程序中从Apollo链接上下文访问Express HTTP请求?

  8. 8

    如何在Angular应用程序中隐藏损坏的图像

  9. 9

    如何在Azure上的多个实例Web应用程序中同步服务器操作?

  10. 10

    如何在Windows 8应用程序中同步显示MessageDialog?

  11. 11

    如何在嵌入Grizzly的Jersey应用程序上获取HTTP请求方法?

  12. 12

    如何在Angular js中进行同步http请求

  13. 13

    区分应用程序对$ http的调用和Angular在拦截器中对静态资源的请求

  14. 14

    当通过在Android中刷卡杀死应用程序时,如何调用Web服务(Http请求)?

  15. 15

    如何解决来自 Node.js 应用程序的外部 HTTP 请求中的错误

  16. 16

    如何在JavaScript中执行同步HTTP请求

  17. 17

    如何在单页 Web 应用程序中处理 node.js 中的“发布”请求

  18. 18

    如何检查单个应用程序的传出HTTP请求?

  19. 19

    在R Shiny应用程序中接受HTTP请求

  20. 20

    在应用程序的onStop中在android中发送http请求

  21. 21

    Spring RESTful 应用程序中的 HTTP POST 请求

  22. 22

    如何在Silex应用程序中避免超出请求范围的异常?

  23. 23

    如何在Windows 10 Preview中安装应用程序请求路由ARR 3.0?

  24. 24

    如何在Android应用程序中请求特定的文本大小?

  25. 25

    Rails:如何在仅API应用程序中暂停请求周期?

  26. 26

    我如何在React应用程序中向API发出一百万个以上的请求?

  27. 27

    仅在请求Servlet时如何在Tomcat中初始化Web应用程序

  28. 28

    如何在基于EJB的Web应用程序中过滤请求?

  29. 29

    如何在整个应用程序中维护请求队列的单个实例

热门标签

归档