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

How to synchronise HTTP requests in angular application?

我已经实现了一个 cacheService,它具有方法 get(url),它从 HTTP 获取值,将其放入 localStorage 和 returns $q promise。在下一个 .get(url) 运行 中,它从 localStorage 获取值,并且 returns 它用 $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;
    });
}

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

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

而且我不喜欢它。

所以问题是:

如何将 url 的请求同步为每个 url 只有 1 个请求?

更新: 我有个主意:

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

你怎么看?

这可能不是很好的解决方案。不过你可以试试看。

我建议你维护 promise 数组。

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.   
}